没有 get 的自动实现的属性给出编译错误

Auto-Implemented Properties without get gives Compilation Error

public int MyWriteOnlyProperty1 { set; }      /* Error: Auto-Implemented properties must have get accessors.*/
public int MyWriteOnlyProperty2 { set { } }   // No error

为什么一个有编译时错误,而另一个没有错误? 两者之间是否有任何有意义的区别,因为它是这样决定的?

第二个不是自动实现的。在这个简单的例子中,编译器当然有可能去找出你的 属性 实现被破坏了(因为 setter 没有做任何事情)但是很难涵盖所有可能的情况"this property is broken" 的情况,所以我想这就是为什么他们不会打扰,除了自动实现的属性是微不足道的。

例如考虑一下,属性的有效但奇怪的用法:

private int _myValue;
public int MyWriteOnlyProperty2 { set { _myValue = value; } }

或者这个例子,其中 属性 和你的例子一样坏,但现在编译器很难知道。最好把它留给开发人员。

public int MyWriteOnlyProperty2 { set { DoNothing(value); } }
private void DoNothing(int value) { //Does nothing }

第二个不是自动实现的。您明确地使用空体实现 setter 。仅设置 属性 是不寻常的,但它是有效的。告诉你实现应该是什么样子不是编译器的工作,所以空体是有效的。

但是第一种情况没有任何意义。自动实现的属性使用其他方式无法访问的支持字段。有了它们,同时拥有 getset(具有相同或不同的可访问性)非常有意义。只有 get(在 C# 6.0 中有效)起初听起来有点奇怪,但它确实有道理,因为您实际上可以在构造函数中设置支持字段。

但是只有 set?那没有用,您没有理由要写入无法读取的字段。 (并且只在构造函数中读取也没有意义。)