.NET旧代码是否在新版本中更新?

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)

Run*_* FS 6

只有在有充分理由的情况下才能实现更改,例如更改类层次结构.在这种情况下,它只是为了方便.

这是一个突破性变化原因的一个例子:假设一个项目有这两种方法.

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)不会超过成本(设计,实现,测试,记录),也不会超过打破客户工作的潜在成本.