.NET 2.0中自动实现属性初始化为何可行?(该特性属C#6/.NET4.6)
为什么目标框架是.NET 2.0却能编译C# 6的自动实现属性初始化?
这事儿其实是编译器版本和目标框架版本脱钩导致的,别惊讶,听我慢慢拆解:
- 首先,C#语言特性的支持是由你的C#编译器版本决定的,而非目标.NET框架版本。比如你用的是VS2015及以后的版本(对应C#6+编译器),哪怕把项目目标设为.NET 2.0,编译器依然能识别并处理C#6的语法。
- 其次,自动实现属性初始化本质是编译器的语法糖。编译器会把你写的简化代码:
转换成.NET 2.0完全能理解的传统写法,等效代码如下:public double Radius { get; set; } = 12.45;
这种代码在.NET 2.0里是完全合法的,所以编译和运行都不会出问题。private double _radius = 12.45; public double Radius { get { return _radius; } set { _radius = value; } } - 当然要注意:如果代码用到了.NET高版本框架才有的API(比如.NET 4.6新增的类或方法),那即使编译器能通过,运行时还是会报错。但自动实现属性初始化只是语法层面的转换,没有依赖高版本框架的API,所以在.NET 2.0上能正常跑。
拿你给出的完整代码举例:
class Program { static void Main() { Circle cr = new Circle(); Console.WriteLine("Radius=" + cr.Radius); } } class Circle { public double Radius { get; set; } = 12.45; // Initializing Auto Implemented property }
用C#6+编译器编译并指定目标.NET 2.0后,运行会输出Radius=12.45,完全符合预期。
内容的提问来源于stack exchange,提问作者Varun Laxman Bhandarkar
相关产品推荐
相关产品推荐

