我只是问这个问题,因为在尝试迭代DataRowCollection
时,我也遇到了同样的情况:
DataSet s;
...
foreach (var x in s.Tables[0].Rows)
{
//IntelliSense doesn't work here. It takes 'x' as an object.
}
我在Why is there no Intellisense with 'var' variables in 'foreach' statements in C#?看到了@Marc Gravell的回答,现在我很清楚为什么会这样。
我决定查看DataRowCollection
类的代码,GetEnumerator()
是:
return this.list.GetEnumerator();
其中list
是继承抽象类DataRowTree
的{{1}}类型(顺便说一下,,从来不知道.NET中有一个红黑树的实现在之前实现RBTree<K>
而不是IEnumerable
。
难以让IEnumerable<K>
实施RBTree<K>
吗?这将解决这里的主要问题。
我认为它是在以前的.NET版本中开发的,但这不再有意义,是吗?
我的问题是:
.NET旧代码是否在新版本中更新?(例如,make IEnumerable<K>
实现DataRowCollection
而不是IEnumerable<DataRow>
)
答案 0 :(得分:6)
只有在有充分理由的情况下才能实现更改,例如更改类层次结构。在这种情况下,这只是为了方便。
这是一个突破性变化的原因的一个例子: 假设一个项目有这两种方法。
public void Foo(object obj){
Console.WriteLine(obj.ToString();
}
public void Foo<T>(IEnumerable<T> obj){
throw new Exception();
}
现在您想要的更改将使已重新编译但未更改的程序每次都抛出异常而不是打印到控制台。并不是它抛出了问题,而是行为不同。
还有其他方法可以打破/改变一个非常好的程序,这样的好处(能够在foreach循环中编写var)不会超过成本(设计,实现,测试,记录),也不会超过成本的潜在成本。打破客户的工作。