我只是想知道Convert
类和IConvertible
接口如何与DataRow
一起工作。如果我有这个代码:
string s="25";
int x= Convert.ToInt32(s);
对Convert.ToInt32(s)
的调用将运行以下内容:
((IConvertible)s).ToInt32()
那么,这是如何与这样一行代码一起工作的:
Convert.ToInt32(myDataRow["intField"]);
当DataRow和对象都没有实现IConvertable时?
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
如果你试图在一个没有实现IConvertable的对象上运行该方法,你会得到一个运行时类型转换异常:
var o = new object();
var x2 = Convert.ToInt32(o);
// throws System.InvalidCastException: "Unable to cast object of type 'System.Object' to type 'System.IConvertible'."