请问以下两者有什么区别?
var dtime = (DateTime)datatable[0]["SomeDateTime"];
var dtime = datatable[0].field<DateTime>("SomeDateTime");
EDIT 而这:
var dtime = Convert.ToDateTime(datatable[0]["SomeDateTime"]);
答案 0 :(得分:3)
不同之处在于,第一个使用自己的显式投射而第二个投射在DataRow
扩展方法Field
的幕后。
因此,如果datetime-column可以包含空值,则可以使用DateTime?
:
DateTime? dtime = datatable.Rows[0].Field<DateTime?>("SomeDateTime");
所以我建议使用Field
。它是强类型的(隐藏演员表)并支持可空类型。通过(TypeName)
显式投射也不太可读。
答案 1 :(得分:1)
在第一行
var dtime = (DateTime)datatable[0]["SomeDateTime"];
使用返回object
的indexer属性。所以你需要自己把它投射到你期望对象的实际类型。
第二种情况
var dtime = datatable[0].Field<DateTime>("SomeDateTime");
调用尝试为您执行转换的泛型扩展方法Field<T>
并返回您指定的类型(因此在示例中为DateTime
)。
您可以检查参考源中indexer和Field<T>()
extension method
答案 2 :(得分:0)
给出的例子之间的主要区别是转换方法
(Type)
接受你所拥有的任何类型并迫使它成为那种类型,错误地说它不合适
<Type>
传递一个泛型类型,用于在无类型定义中使用字段的实现,这意味着有幕后逻辑帮助你转换
和Convert.ToType()
正在使用转换器类进行转换,因为它的调用要求类型与IConvertable接口兼容,这意味着有人已经考虑使该类型可转换,这意味着你可能得到一个成功的结果
否则您只是使用不同的方法来访问命名字段(this属性或字段方法