繁体   English   中英

为什么此C#代码具有未声明的get主体构建? 以及如何使编译器对此产生错误?

[英]Why does this C# code with an an undeclared get body build? And how can I make the compiler throw an error on this?

令我惊讶的是,以下代码可以构建并正常运行:

private abstract class MyParent
{
    public abstract bool MyBool { get; }
}

private class MyChild : MyParent
{
    public override bool MyBool { get; } //no body declared
}

[TestMethod]
public void MyTestMethod()
{
    var mc = new MyChild();
    Assert.IsFalse(mc.MyBool);
}

我也没有收到任何警告。 测试甚至通过。 我不希望它会编译,因为MyChild类没有为重写的MyBool getter声明主体。 我尝试将MyChild类标记为sealed ,但仍可以编译。 我的第一个问题很简单,为什么不要求MyChild类为MyBool getter提供主体?

我发现我的代码中存在这样的问题,因为我的构建服务器报告了一个编译器错误,指出:

“ MyChild.MyBool.get”必须声明一个主体,因为它没有被标记为抽象或外部。 自动实现的属性必须定义get和set访问器。

构建服务器必须使用某些设置来阻止编译相同的代码。 我的第二个问题是:当我尝试编译此代码时,可以检查哪些设置以确保编译器向我发出此警告?

我不希望它会编译,因为MyChild类没有为重写的MyBool getter声明主体。

那是因为它很好。 MyBool属性具有一个(隐式)设置器,但仅对构造方法可用。 这是C#6编译器的新功能,因此您的构建服务器需要相同版本的编译器才能完成此工作。

不需要抛出异常或类似的东西。 如果要声明一个set ,只需确保将其添加到基类的属性定义中即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM