C# 数据表行属性

C# 数据表行属性,c#,vb.net,C#,Vb.net,VB允许对System.Data.DataTable类型进行直接索引,而不是调用“Rows”属性Rows'不是索引器,而是返回DataRowCollection的常规属性 Dim dt As New DataTable() Dim x = dt(0) 'instead of Dim x = dt.Rows(0) C#要求显式调用“Rows”属性: DataTable dt = new DataTable(); var x = dt.Rows(0); 为什么会这样?有没有一种方法可以通过反射找

VB允许对System.Data.DataTable类型进行直接索引,而不是调用“Rows”属性Rows'不是索引器,而是返回DataRowCollection的常规属性

Dim dt As New DataTable()
Dim x = dt(0) 'instead of Dim x = dt.Rows(0)
C#要求显式调用“Rows”属性:

DataTable dt = new DataTable();
var x = dt.Rows(0);

为什么会这样?有没有一种方法可以通过反射找到这种行为?反射方法GetDefaultMembers不会为System.Data.DataTable返回任何内容。

如果检查VB项目的引用,您将看到System.Data.DataSetExtensions.dll有一个引用。删除它,您将看到您的代码不再在VB中工作。VB编译器似乎是为了映射以下内容而编写的:

Dim x=dt(0)
为此:

Dim x=dt.AsEnumerable().ElementAt(0)

C#编译器不执行等效操作,您必须显式调用这些方法。对于VB编译器来说,做这些小而有用的事情来隐藏一些复杂性是很正常的。就我个人而言,我总是使用
属性。这样做并不繁重。

太棒了!谢谢。@DaveDoknjas,请参阅@DaveDoknjas,您可以像VB编译器一样,寻找范围内的适当扩展方法,但这将非常痛苦。值得注意的是,VB编译器在将索引映射到
ElementAt
方面做了类似的事情,而C#编译器则没有。即使没有对System.Data.DataSetExtensions.dll的引用,VB仍然支持
Dim row=table.Rows.Cast(数据行的)()(0)
,即使您实际上无法为
IEnumerable(t的)
编制索引。另一方面,C#不支持
var row=table.Rows.Cast()[0]。要么你做错了什么,要么你的IDE坏了。我只是在一个控制台应用程序中尝试了同样的方法,删除了除System.dll和System.Data.dll之外的所有引用,然后将您的第一个代码片段粘贴到
Main
方法中,得到了相同的错误消息。就这个问题而言,它可能是学术性的,但是如果你或你的IDE坏了,那么你应该修复它以避免其他地方出问题。FWIW,
Dim row=table.Rows.Cast(数据行的)的例子()(0)
附加了一个对
ElementAtOrDefault
的调用来实现这个技巧。在C#中,您不能直接将索引器应用于
IEnumerable
集合(
IEnumerable l=new List();var s=l[0]),它是LINQ查询的结果。它只实现
IEnumerable
@Jimi:Sorry-我已经从测试解决方案中的另一个项目中删除了引用。