Как интерфейс 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'."