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

8

请问C# 4.0和C# 2.0有什么区别?C# 4.0是否向下兼容C# 2.0?

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

谢谢。

6个回答

12

C# 4.0与之前的版本几乎兼容,但有一些重大变更。对于大多数普通代码,你不会注意到这些变更。

关于C#4中的新功能,您可以查看维基百科文章,其中有相当好的摘要和示例。关键点包括:

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

还要记住,还有一个版本在其间 - C#3.0。这里最重要的添加之一是LINQ及其可能性增加的所有功能。 C#2.0和3.0之间的差异远大于C#3.0和4.0之间的差异。


顺便提一下,不是所有有效的C代码都是有效的C++代码,正如您在问题中暗示的那样,请参见此处

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


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在他的博客上有一系列关于这些变化的文章。

0

0

是的,

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

您在C# 2.0中编写的所有内容都可以在C# 4.0中运行。

但是显然反过来是不行的......


5
“在C# 2.0中写的所有内容都可以在C# 4.0中运行”这种说法有些夸大——请参考我的回答,其中举了一个破坏性变更的示例。 - Jon Skeet

0

需要注意的一点是要留心过时的东西 - 例如ADO.NET中的OracleClient...

Martin

编辑 - 是的,Simon说得有道理...实际上我在谈论.Net。抱歉...


0

从C#2.0开始,添加了许多功能,如下:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接