4

我只是想知道Convert类和IConvertible接口如何与DataRow. 如果我有这个代码:

string s="25";
int x= Convert.ToInt32(s);

调用Convert.ToInt32(s)将运行以下命令:

((IConvertible)s).ToInt32()

那么这如何与这样的一行代码一起工作:

Convert.ToInt32(myDataRow["intField"]);

当 DataRow 和对象都没有实现 IConvertible 时?

4

1 回答 1

8

DataRow 字段作为对象公开,因此对 进行了调用Convert.ToInt32(object value),这正是您在问题中所说的:

return value == null? 0: ((IConvertible)value).ToInt32(null);

运行时尝试执行从object到的转换IConvertibleobject不实现接口没关系;重要的是,无论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'."
于 2012-01-30T14:24:04.543 回答