Поля 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'."