为什么不允许使用以下 C# 代码:
public abstract class BaseClass
{
public abstract int Bar { get;}
}
public class ConcreteClass : BaseClass
{
public override int Bar
{
get { return 0; }
set {}
}
}
CS0546 'ConcreteClass.Bar.set': cannot override because 'BaseClass.Bar' does not have an overridable set accessor
我认为主要原因很简单,语法太明确了,无法以任何其他方式工作。这段代码:
public override int MyProperty { get { ... } set { ... } }
非常明确,get
和 set
都是重写。基类中没有 set
,因此编译器会报错。就像您不能覆盖未在基类中定义的方法一样,您也不能覆盖 setter。
您可能会说编译器应该猜测您的意图并且只将覆盖应用于可以覆盖的方法(即本例中的 getter),但这违反了 C# 设计原则之一 - 编译器不得猜你的意图,因为它可能会在你不知情的情况下猜错。
我认为以下语法可能会做得很好,但正如 Eric Lippert 一直说的那样,即使实现像这样的一个小功能仍然需要大量的工作......
public int MyProperty
{
override get { ... } // not valid C#
set { ... }
}
或者,对于自动实现的属性,
public int MyProperty { override get; set; } // not valid C#