Поля 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'."
Вызов метода не будет волшебным образом превратить в вызов другой метод , Метод, который вы назвали, может в свою очередь вызвать другой метод, но это что-то другое. – svick