【发布时间】:2010-05-16 10:19:25
【问题描述】:
我可以知道 C# 4.0 和 C# 2.0 之间有什么区别吗? C# 4.0 是否向后兼容 C# 2.0?
我能说 C# 4.0 是 C# 2.0 的超集吗(就像 C++ 之于 C)?
谢谢。
【问题讨论】:
我可以知道 C# 4.0 和 C# 2.0 之间有什么区别吗? C# 4.0 是否向后兼容 C# 2.0?
我能说 C# 4.0 是 C# 2.0 的超集吗(就像 C++ 之于 C)?
谢谢。
【问题讨论】:
C# 4.0 几乎向后兼容以前的版本,但有 a few breaking changes。对于大多数普通代码,您不会注意到这些重大变化。
对于 C# 4 中的新功能,您可以查看Wikipedia article,其中有很好的示例总结。重点是:
还请记住,两者之间还有另一个版本 - C# 3.0。这里最重要的新增功能之一是 LINQ 以及为使其成为可能而添加的所有功能。 C# 2.0 和 3.0 的区别远大于 C# 3.0 和 4.0 的区别。
顺便说一句,正如您在问题中暗示的那样,并非所有有效的 C 代码都是有效的 C++。见here:
在严格的数学意义上,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>());
}
}
在 C# 4 中,这将打印“Derived” - 在 C# 2 和 3 中,它将打印“Base”。
在 C# 1 和 2 之间也出现了同样的问题,其中委托实例表达式允许非泛型协变和逆变。
任何新的转换都几乎必然会产生此类问题。然而,根据我的经验,这些事情实际上不太可能导致问题。
此外,C# 4 以稍微不同的方式处理锁定和类似字段的事件 - 同样,这不会影响大多数代码,但值得了解。 Chris Burrows 在他的博客中有一个 series of articles 来了解他的变化。
【讨论】:
是的,他们曾经这样做过。
【讨论】:
C# 2.0 的所有功能仍在 C# 4.0 中,但是,版本 4 中的新功能显然不在版本 2 中。
您在 C# 2.0 中编写的所有内容都将在 C# 4.0 中运行。
但显然相反是行不通的.....
【讨论】:
从 C# 2.0 中添加了许多功能如下:
所以请查看以上链接以了解新功能..
【讨论】:
但请注意 - 小心被弃用的想法 - 例如 ADO.Net 中的 OracleClient...
马丁
编辑 - 是的,Simon 说得有道理……我说的是 .Net。对不起...
【讨论】: