为什么这个C#代码有一个未声明的get body build?我怎样才能让编译器在这个问题上抛出一个错误呢?

为什么这个C#代码有一个未声明的get body build?我怎样才能让编译器在这个问题上抛出一个错误呢?,c#,C#,令我惊讶的是,以下代码构建并运行良好: 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 =

令我惊讶的是,以下代码构建并运行良好:

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”必须声明一个主体,因为它没有标记 抽象的或外在的。自动实现的属性必须定义 获取和设置访问器

生成服务器必须使用阻止编译此代码的某些设置。我的第二个问题是:当我试图编译这段代码时,我可以检查什么设置来确保编译器给我这个警告

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

那是因为它非常好。
MyBool
属性有一个(隐式)setter,但该setter仅对构造函数可用。这是C#6编译器的一项新功能,因此构建服务器需要相同版本的编译器才能实现这一功能


没有必要抛出异常或类似的东西。如果要声明
,请确保将其添加到基类中的属性定义中。

它有一个隐式getter。对于简单的属性获取程序,这是完全正确且推荐的属性语法。请看这里。您仍然可以将其定义为
私有get,如果您不希望覆盖它。在提供的示例中,子类只是实现与基类相同的getter。没问题。我不认为你会在这方面出现异常。让我惊讶的是,下面的代码构建和运行都很好:是的,如果这是真的,那么肯定有什么不对劲。说不应该。我会努力清洁和建造。或者使用Ildasm.exe查看程序集以查看实际运行的内容文档是错误的@ConradFrix@ConradFrix在VS2015 Roslyn编译器中尝试。还可以尝试添加
public Test(){myProp=2;}
以获得乐趣。哦,是的。添加以下内容很有用:)您知道在生成服务器上编译时,是什么导致我出现编译器错误吗?我们使用的构建服务器可能使用的是较旧的编译器,但我想自动实现的属性可能会存在更长的时间。我将桌面上的编译器从C#6切换到C#5,现在我收到了一条错误消息:
功能“readonly automatically implemented properties”在C#5中不可用。请使用语言版本6或更高版本。
谢谢大家。值得一提的是:如果生成服务器没有使用Visual Studio执行生成(而是使用msbuild或其他东西),那么这可能解释了为什么即使所有软件都是最新的,也会使用旧编译器。在这种情况下,可以安装Microsoft.Net.Compilers NuGet包,强制C#6编译器在任何地方都可以使用,而不是调整以使代码无法编译,即使在构建服务器上可能没有C#6编译器。