C#4.0是否向后兼容C#2.0?

时间:2010-05-16 10:19:25

标签: c# c#-2.0 c#-4.0

我可以知道C#4.0和C#2.0之间的区别是什么? C#4.0是否向后兼容C#2.0?

我可以说C#4.0是C#2.0的超集(就像C ++对C一样)吗?

感谢。

6 个答案:

答案 0 :(得分:12)

C#4.0 几乎向后兼容以前的版本,但有a few breaking changes。对于大多数普通代码,您不会注意到这些重大变化。

对于C#4中的新功能,您可以查看Wikipedia article,其中包含一些非常好的摘要和示例。关键点是:

  • 动态成员查询
  • 协变和逆变通用类型参数
  • 使用COM时的可选ref关键字
  • 可选参数和命名参数
  • 索引属性

还记得中间还有另一个版本 - C#3.0。这里最重要的补充之一是LINQ,并且添加了所有功能以使其成为可能。 C#2.0和3.0之间的差异远大于C#3.0和4.0之间的差异。


顺便说一句,并非所有有效的C代码都是您在问题中隐含的有效C ++。见here

  

在严格的数学意义上,C不是C ++的子集。有些程序是有效的C但不是有效的C ++,甚至还有一些编写C和C ++含义不同的代码的方法。

答案 1 :(得分:7)

有一些细微的突破性变化,就像以前的版本一样。问题在于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>());
    }
}

在C#4中,这将打印“Derived” - 在C#2和3中它将打印“Base”。

在C#1和2之间发生了同样的问题,其中委托实例表达式允许非泛型协方差和逆变。

任何新的转化几乎都会造成这种问题。然而,根据我的经验,这些事情实际上不太可能导致问题。

此外,C#4以稍微不同的方式处理锁定和类似字段的事件 - 再次,这不会影响大多数代码,但值得了解。 Chris Burrows对他博客中的变化有series of articles

答案 2 :(得分:0)

是的,他们曾经这样做过。

Whats new in C# 4.0

答案 3 :(得分:0)

YES,

C#2.0的所有功能仍在C#4.0中,但是版本4中的新功能显然不在版本2中。

您在C#2.0中编写的所有内容都适用于C#4.0。

但显然相反的情况不会起作用.....

答案 4 :(得分:0)

但需要注意的一点是注意 - 请注意不要弃用 - 例如ADO.Net中的OracleClient ......

马丁

编辑 - 是的,西蒙在那里有一点......我真的在谈论.Net。遗憾...

答案 5 :(得分:0)

C#2.0中添加了许多功能如下:

所以请查看以上链接以了解新功能..