c# - 为什么无法覆盖 getter-only 属性并添加 setter?

标签 c# .net properties getter-setter

<分区>

为什么不允许使用以下 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 { ... } }

非常明确,getset 都是重写。基类中没有 set,因此编译器会报错。就像您不能覆盖未在基类中定义的方法一样,您也不能覆盖 setter。

您可能会说编译器应该猜测您的意图并且只将覆盖应用于可以覆盖的方法(即本例中的 getter),但这违反了 C# 设计原则之一 - 编译器不得猜你的意图,因为它可能会在你不知情的情况下猜错。

我认为以下语法可能会做得很好,但正如 Eric Lippert 一直说的那样,即使实现像这样的一个小功能仍然需要大量的工作......

public int MyProperty
{
    override get { ... } // not valid C#
    set { ... }
}

或者,对于自动实现的属性,

public int MyProperty { override get; set; } // not valid C#

关于c# - 为什么无法覆盖 getter-only 属性并添加 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/82437/

相关文章:

c# - 是否放置方法来检索与单独类中的类相关的数据

c# - LINQ(或其他东西)比较两个列表中的一对值(以任何顺序)?

.net - 处理文化中受支持的日期时间值的有限范围时,最佳实践是什么?

objective-c - 如果类属性是原子的,为什么我不能自定义 getter 和 setter?

c# - 如何类型检查枚举实例基类?

c# - 使用可以是不同枚举类型的通用枚举来序列化类

.net - 检查 .NET 远程服务器是否存在 - 我的方法是否正确?

c# - XML 比较,用于检查窗口应用程序是否相同或不同

c# - MVVM 绑定(bind)到 Properties.Settings

objective-c - int 属性出现无法识别的选择器