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'."

调用一个方法不会神奇地转化为调用另一个方法。您调用的方法可能反过来调用另一个方法,但这是不同的。