为什么不允许使用以下 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”:无法重写,因为“BaseClass.Bar”没有可重写的设置访问器
我认为主要原因很简单,语法太明确,无法以任何其他方式工作。这段代码:
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#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)