繁体   English   中英

C#3.0定位2.0

[英]C# 3.0 Targeting 2.0

我不明白这是如何工作的 - 我正在使用VS2008并使用像var关键字这样的3.0语言功能。

然而,我可以编译并运行2.0框架版本

怎么可能?

编辑:是否有一个网站定义了CLR,框架和语言功能以及向后兼容性 - 我很困惑所有这些

一些语言功能只是编译器是智能的 - var就是其中之一。 编译后的代码没有迹象表明变量是通过var声明的。

其他功能(例如扩展方法)需要框架的支持。 扩展方法通过ExtensionAttribute识别和公布。 同样,表达式树需要Expression类及其子类。

其他一些功能也需要CLR支持--C#2中的泛型是最明显的例子。 C#3中没有任何功能完全需要CLR支持; .NET 3.5附带一个Service Pack到CLR,但没有重大更改。 我怀疑有一些极端情况,v2 CLR之前会遇到一些表达式树的问题。 (我认为DynamicMethod在内部发生了一些变化,虽然我不记得细节。)可能还有一些可验证的调整。

我有一篇文章描述了在针对.NET 2时可以使用C#3中的哪些功能。我将很快将其扩展为包含C#4。

原因是使用大多数3.0功能从C#编译器生成的二进制文件与2.0运行时兼容。 CLR不关心您使用的语言或语言版本,只关注二进制文件与其规范兼容。

var关键字是最简单的情况,因为它只是推断出局部变量的类型。 然后,编译器将显式类型写入二进制文件。 因此,就发射的IL而言,以下2行是等效的

var x = 42;
int x = 42;

例如, var是一个编译时功能,并不与任何特定的版本框架相关联(除了它是随Visual Studio 2008引入的那样)。

跨框架版本的另一个编译时功能(略微让我自己惊讶)是Visual Studio 2010中的可选参数和命名参数。但是编译器可以轻松生成任何必要的方法。

var是纯粹的编译器功能,它不需要任何特定于运行时的支持

C#3.0中的所有新功能都不需要对底层.NET运行时进行任何更改:诸如var关键字,扩展方法和自动属性之类的结果会产生您可以在2.0中手动编写的代码。

换句话说, var关键字是语法糖。

框架版本仅确定您可以访问的库类和方法。 var是一个完全编译时的概念。 这两行编译成完全相同的IL:

var str = String.Empty;
string str = String.Empty;

同样,自动属性完全是编译时。 这个:

private string <>SomeRandomName;
public string Prop {
    get { return <>SomeRandomName; }
    set { <>SomeRandomName = value; }
}

还有这个:

public string Prop { get; set; }

产生完全相同的IL(模数变量名和属性装饰)。

这些功能不依赖于mscorlib程序集中可用的类和方法

简而言之,.NET 3.5的所有功能都可以由编译器转换为2.0构造。 框架本身没有任何改变,编译器只是学到了一些新的技巧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM