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