2016-06-13 7 views
2

、次のコードでは、構築し、正常に動作:なぜこの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番目の質問は、このコードをコンパイルしようとするとコンパイラがこの警告を出すのを確認するためにどのような設定をチェックできますか?

+3

暗黙のゲッターがあります。これは、単純なプロパティゲッターのための完全に正確で推奨されるプロパティ構文です。 [自動実装プロパティ](https://msdn.microsoft.com/en-us/library/bb384054.aspx)を参照してください。上書きしたくない場合は、 'private get;'として定義することができます。提供される例では、サブクラスは基本クラスと同じゲッターを実装するだけです。問題はない。 – ManoDestra

+0

私はあなたがこの例外を得ることができるとは思わない – techspider

+0

*私の驚いたことに、次のコードはうまく構築され実行されます。 [コンパイラエラーCS0840](https://msdn.microsoft.com/en-us/library/bb397743.aspx)には、そうしてはいけないと言います。私は努力してきれいにしてビルドします。またはIldasm.exeでアセンブリを見て、実際に実行しているものを見てください。 –

答えて

3

MyChildクラスをオーバーライドMyBoolゲッターのために体を宣言していないので、私はこれをコンパイルする期待していません。

これは完璧なためです。 MyBoolプロパティには(暗黙の)セッターがありますが、これはコンストラクターでのみ使用できます。これはC#6コンパイラの新機能です。このため、ビルドサーバーには同じバージョンのコンパイラが必要です。

例外をスローする必要はありません。 setを宣言したい場合は、それを基本クラスのプロパティ定義に追加してください。

+0

ああ、はい。これは便利です:) –

+0

ビルドサーバーでコンパイルするときにコンパイルエラーが発生する原因を知っていますか?古いコンパイラを使用してビルドサーバーを使用している可能性もありますが、自動実装されたプロパティーはもっと長くなっていたと思います。 – user2023861

+0

この機能は、http:// stackoverflowの間にあります。com/questions/6001917/what-are-automatic-properties-in-c-sharp-and-of-their-purposeの目的 – ManoDestra

関連する問題