C# IConvertible接口如何处理DataRow?
我只是想知道C# IConvertible接口如何处理DataRow?,c#,.net,datarow,iconvertible,C#,.net,Datarow,Iconvertible,我只是想知道Convert类和IConvertible接口如何与DataRow一起工作。如果我有此代码: string s="25"; int x= Convert.ToInt32(s); 调用Convert.ToInt32将运行以下操作: ((IConvertible)s).ToInt32() 那么,对于这样一行代码,这是如何工作的: Convert.ToInt32(myDataRow["intField"]); 当DataRow和object都未实现IConvertible时?Data
Convert
类和IConvertible
接口如何与DataRow
一起工作。如果我有此代码:
string s="25";
int x= Convert.ToInt32(s);
调用Convert.ToInt32
将运行以下操作:
((IConvertible)s).ToInt32()
那么,对于这样一行代码,这是如何工作的:
Convert.ToInt32(myDataRow["intField"]);
当DataRow和object都未实现IConvertible时?DataRow字段作为对象公开,因此调用
Convert.ToInt32(对象值)
,这与您在问题中所说的完全相同:
return value == null? 0: ((IConvertible)value).ToInt32(null);
运行时尝试执行从对象
到IConvertible
的转换。对象
没有实现接口并不重要;重要的是,无论运行时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'."
调用一个方法不会神奇地转化为调用另一个方法。您调用的方法可能反过来调用另一个方法,但这是不同的。