、次のコードでは、構築し、正常に動作:なぜこのC#コードは宣言されていないget bodyビルドですか?そして、どのように私はコンパイラがこれにエラーをスローすることができますか?私の驚きに
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
ゲッターのボディを宣言していないため、これはコンパイルされません。私はMyChild
クラスsealed
をマークしようとしましたが、まだコンパイルされています。私の最初の質問は、単にゲッターのボディを提供するためにMyChild
クラスが必要でない理由は何ですか?
私は私のビルドサーバーが言ったコンパイラエラー報告ので、私は私のコードでは、このような問題を抱えていたことが判明:
「をMyChild.MyBool.get」は をマークされていないので、体を宣言する必要があります抽象的または外的。自動的に実装されるプロパティでは、アクセッサのgetとsetの両方を と定義する必要があります。
ビルドサーバーは、この同じコードのコンパイルを妨げるいくつかの設定を使用している必要があります。私の2番目の質問は、このコードをコンパイルしようとするとコンパイラがこの警告を出すのを確認するためにどのような設定をチェックできますか?
暗黙のゲッターがあります。これは、単純なプロパティゲッターのための完全に正確で推奨されるプロパティ構文です。 [自動実装プロパティ](https://msdn.microsoft.com/en-us/library/bb384054.aspx)を参照してください。上書きしたくない場合は、 'private get;'として定義することができます。提供される例では、サブクラスは基本クラスと同じゲッターを実装するだけです。問題はない。 – ManoDestra
私はあなたがこの例外を得ることができるとは思わない – techspider
*私の驚いたことに、次のコードはうまく構築され実行されます。 [コンパイラエラーCS0840](https://msdn.microsoft.com/en-us/library/bb397743.aspx)には、そうしてはいけないと言います。私は努力してきれいにしてビルドします。またはIldasm.exeでアセンブリを見て、実際に実行しているものを見てください。 –