C# 6.0引入的Auto-implemented properties究竟是什么?为何C#5.0可使用基础自动属性?
问题解答
核心误解:基础自动实现属性并非C#6.0新增
你看到的public string Bar { get; set; }这类带读写访问器的自动实现属性,早在C#3.0就已经引入,所以在C#5.0环境下能正常编译运行完全合理。
微软版本历史页面提到的"Auto-implemented properties"作为C#6.0新增特性,指的是自动实现属性的增强功能,而非基础的读写自动属性。
C#6.0新增的自动实现属性增强特性
以下这些是C#6.0才支持的自动实现属性相关功能,在C#5.0环境下编译会失败:
- 只读自动实现属性的声明式初始化:无需在构造函数中赋值,直接在属性声明时设置默认值
// C#6+支持,C#5及以下报错 public class Foo { public string Bar { get; } = "default value"; } - 只读自动实现属性的构造函数赋值:只读自动属性可以在构造函数中赋值(C#5及以下的只读属性必须手动写私有字段+getter,无法用自动实现语法)
// C#6+支持,C#5及以下报错 public class Foo { public string Bar { get; } public Foo(string bar) { Bar = bar; } } - 表达式体形式的只读自动属性:用箭头表达式简化getter实现
// C#6+支持,C#5及以下报错 public class Foo { public string FirstName { get; set; } public string LastName { get; set; } public string FullName => $"{FirstName} {LastName}"; }
为什么你的测试代码能在C#5.0运行?
你写的public string Bar { get; set; }是C#3.0就支持的基础自动实现属性,和C#6.0的增强特性无关。而字符串插值$"{x}"、空条件运算符x?.y确实是C#6.0的全新特性,所以在C#5.0环境下会编译失败,这和自动实现属性的情况并不矛盾。
内容的提问来源于stack exchange,提问作者Jim Cullen
相关产品推荐
相关产品推荐

