C# datatable中命名字段和命名列之间的差异

C# datatable中命名字段和命名列之间的差异,c#,datatable,C#,Datatable,请问下面两个有什么区别 var dtime = (DateTime)datatable[0]["SomeDateTime"]; var dtime = datatable[0].field<DateTime>("SomeDateTime"); 在第一行 var dtime = (DateTime)datatable[0]["SomeDateTime"]; 使用返回对象的indexer属性。因此,您需要自己将其转换为您期望对象的实际类型 第二种情况 var dtime = data

请问下面两个有什么区别

var dtime = (DateTime)datatable[0]["SomeDateTime"];
var dtime = datatable[0].field<DateTime>("SomeDateTime");
在第一行

var dtime = (DateTime)datatable[0]["SomeDateTime"];
使用返回
对象的indexer属性
。因此,您需要自己将其转换为您期望对象的实际类型

第二种情况

var dtime = datatable[0].Field<DateTime>("SomeDateTime");
var dtime=datatable[0]。字段(“SomeDateTime”);
调用泛型扩展方法
字段
,该方法尝试为您执行强制转换,并返回您指定的类型(在您的示例中为
DateTime

您可以在参考源中检查第一行中的和的不同实现

var dtime = (DateTime)datatable[0]["SomeDateTime"];
使用返回
对象的indexer属性
。因此,您需要自己将其转换为您期望对象的实际类型

第二种情况

var dtime = datatable[0].Field<DateTime>("SomeDateTime");
var dtime=datatable[0]。字段(“SomeDateTime”);
调用泛型扩展方法
字段
,该方法尝试为您执行强制转换,并返回您指定的类型(在您的示例中为
DateTime


您可以在参考源中检查和的不同实现。不同之处在于第一种方法使用自己的显式强制转换,而第二种方法在后台使用
DataRow
扩展方法

因此,如果datetime列可以包含空值,您将使用
datetime?

DateTime? dtime = datatable.Rows[0].Field<DateTime?>("SomeDateTime");
DateTime?dtime=datatable.Rows[0]。字段(“SomeDateTime”);

所以我建议使用。它是强类型(隐藏强制转换)并支持可为空的类型。通过
(TypeName)
进行的显式强制转换可读性也较低。

不同之处在于,第一种方法使用自己进行的显式强制转换,而第二种方法在
数据行
扩展方法中进行幕后强制转换

因此,如果datetime列可以包含空值,您将使用
datetime?

DateTime? dtime = datatable.Rows[0].Field<DateTime?>("SomeDateTime");
DateTime?dtime=datatable.Rows[0]。字段(“SomeDateTime”);

所以我建议使用。它是强类型(隐藏强制转换)并支持可为空的类型。通过
(TypeName)
显式转换的可读性也较低。

给出的示例之间的主要区别是转换方法

(Type)
接受您拥有的任何类型,并强制它成为该类型,错误为它不适合

正在为字段的实现传入一个泛型类型,以便在其无类型定义中使用,这意味着有幕后逻辑帮助您转换

Convert.ToType()
正在使用converter类来进行转换,因为它的调用要求类型与IConvertable接口兼容这意味着有人已经考虑过使该类型可转换,这意味着您可能会获得成功的结果


否则,您只是使用不同的方法访问命名字段(this属性或字段方法)。给出的示例之间的主要区别是转换方法

(Type)
接受您拥有的任何类型,并强制它成为该类型,错误为它不适合

正在为字段的实现传入一个泛型类型,以便在其无类型定义中使用,这意味着有幕后逻辑帮助您转换

Convert.ToType()
正在使用converter类来进行转换,因为它的调用要求类型与IConvertable接口兼容这意味着有人已经考虑过使该类型可转换,这意味着您可能会获得成功的结果


否则,您只是使用不同的方法访问命名字段(this属性或field方法

什么是
datatable
?因为如果它是
datatable
,则不会编译。请不要提供伪代码,而是编译代码(如果这是问题,请提供不编译的代码)…您可能正在谈论DataRowCollection。请为您的变量提供一个不太容易混淆的名称。它是一个datatable,并且编译时没有错误。我得到的唯一错误是强制转换异常。是的,使用[0]索引datatable它实际上是一个datarow,我可以更改它,但我不认为这会造成混淆。
DataTable
没有默认的索引器方法,因此您不能写入
DataTable[0]
,而只能写入
DataTable.Rows[0]
。什么是
数据表
?因为如果是
数据表
,则不会编译。不要提供伪代码,而是编译代码(如果是问题,则提供不编译的代码)…您可能正在谈论DataRowCollection。请为您的变量提供一个不太容易混淆的名称。它是一个datatable,并且编译时没有错误。我得到的唯一错误是强制转换异常。是的,使用[0]索引datatable它实际上是一个datarow,我可以更改它,但我不认为这会造成混淆。
DataTable
没有默认的索引器方法,因此您不能写入
DataTable[0]
,而只能写入
DataTable.Rows[0]
。谢谢Tim。那么如果datatable包含null,那么只有字段可以工作?谢谢Tim。那么如果datatable包含null,那么只有字段可以工作?