Как интерфейс IConvertible работает с DataRow?

Мне просто интересно, как Convert класс и IConvertible интерфейс работает с DataRow, Если у меня есть этот код:

string s="25";
int x= Convert.ToInt32(s);

Призыв к Convert.ToInt32(s) будет работать следующее:

((IConvertible)s).ToInt32()

Итак, как это работает с такой строкой кода:

Convert.ToInt32(myDataRow["intField"]);

Когда ни DataRow, ни объект не реализуют IConvertible?

1 ответ

Решение

Поля DataRow отображаются как объекты, поэтому вызывается Convert.ToInt32(object value), который делает именно то, что вы сказали в своем вопросе:

return value == null? 0: ((IConvertible)value).ToInt32(null);

Среда выполнения пытается выполнить преобразование из object в IConvertible, Это не важно object не реализует интерфейс; важно то, что какой-то конкретный, конкретный тип находится в DataRow во время выполнения должен реализовать интерфейс. Все встроенные базовые типы CLR реализуют IConvertible, например, так он будет называть String.ToInt32() или же Boolean.ToInt32() или что угодно. Интерфейсы реализованы явно, поэтому вы не можете вызывать эти методы напрямую string или же bool, но вы могли бы сбрасывать IConvertible и сделай это.

object s = new System.String('1', 3);
var i = Convert.ToInt32(s);

// s = "111"; i = 111

Если вы попытаетесь запустить этот метод на объекте, который не реализует IConvertible, вы получите исключение при передаче типов времени выполнения:

var o = new object();
var x2 = Convert.ToInt32(o);

// throws System.InvalidCastException: "Unable to cast object of type 'System.Object' to type 'System.IConvertible'."
Другие вопросы по тегам