[英]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.