Mar*_*ers 12
C#4.0 几乎与以前的版本向后兼容,但有一些重大变化.对于大多数普通代码,您不会注意到这些重大变化.
对于C#4中的新功能,您可以查看维基百科文章,其中包含一些非常好的摘要和示例.关键点是:
还记得中间有另一个版本 - C#3.0.这里最重要的补充之一是LINQ,并且添加了所有功能以使其成为可能.C#2.0和3.0之间的差异远大于C#3.0和4.0之间的差异.
顺便说一下,并非所有有效的C代码都是您在问题中隐含的有效C++.看到这里:
在严格的数学意义上,C不是C++的子集.有些程序是有效的C但不是有效的C++,甚至有一些编写代码的方法在C和C++中有不同的含义.
正如先前版本中所做的那样,有一些细微的突破性变化.问题在于C#4由于协方差/逆变而引入了一种新型的有效转换.这意味着以前不适用的某些方法现在适用于特定呼叫.这里有一些对C#4和C#2/3都有效的代码:
using System;
using System.Collections.Generic;
public class Base
{
public void DoSomething(IEnumerable<string> strings)
{
Console.WriteLine("Base");
}
}
public class Derived : Base
{
public void DoSomething(IEnumerable<object> objects)
{
Console.WriteLine("Derived");
}
}
public class Test
{
static void Main()
{
Derived d = new Derived();
d.DoSomething(new List<string>());
}
}
Run Code Online (Sandbox Code Playgroud)
在C#4中,这将打印"Derived" - 在C#2和3中它将打印"Base".
在C#1和2之间发生了同样的问题,其中委托实例表达式允许非泛型协方差和逆变.
任何新的转换都必然会产生这种问题.然而,根据我的经验,这些事情实际上不太可能导致问题.
此外,C#4以稍微不同的方式处理锁定和类似字段的事件 - 同样,这不会影响大多数代码,但值得了解.Chris Burrows 在他的博客中有一系列关于这些变化的文章.