DataRow 字段作为对象公开,因此对 进行了调用Convert.ToInt32(object value)
,这正是您在问题中所说的:
return value == null? 0: ((IConvertible)value).ToInt32(null);
运行时尝试执行从object
到的转换IConvertible
。object
不实现接口没关系;重要的是,无论DataRow
运行时的实际具体类型是什么,都必须实现接口。例如,所有内置的 CLR 基类型都实现IConvertible
了 ,因此它将调用String.ToInt32()
orBoolean.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'."