2011-01-26 39 views
40

なぜこのエラーが正直であるのか分かりません。C#は、抽象的、外部的、または部分的にマークされていないため、本文を宣言する必要があります。

public int hour 
{ 
    get; 
    set 
    { 
     //make sure hour is positive 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
        "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
      //take the modulus to ensure always less than 24 hours 
      //works even if the value is already within range, or value equal to 24 
      hour = value % MAX_HOUR; 
     } 
    } 
} 

提案:

private int hour 
{ 
    get; 
    set 
    { 
     //make sure hour is positive 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
        "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
      //take the modulus to ensure always less than 24 hours 
      //works even if the value is already within range, or value equal to 24 
      hour = value % MAX_HOUR; 
     } 
    } 
} 

また、私はちょうど実際のプロパティをやってみましたか?

+0

重複:http://stackoverflow.com/questions/1121940/automatic-properties-in-c-3-must-declare-a-body-for-get-if-i-declare-one- for-s – ChristopheD

+32

簡単なメモ:セッターでUIを表示するのは本当に悪い考えです。取得した場合は – driis

+8

、設定します。それは自動プロパティです。どちらかを定義すると、それはもはや自動プロパティではなくなります。 – JDPeckham

答えて

28

はこれを試してみてください:

public int Hour { get;set;} // Automatic property, no implementation 

またはは、あなたがあなたの例から判断したいものである、getterとsetterの両方のための独自の実装を提供します

あなたが get;部分のための身体だけでなく、propertの部分を提供する必要が
private int hour; 
public int Hour 
{ 
    get { return hour; } 
    set 
    { 
     //make sure hour is positive 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
      "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
      //take the modulus to ensure always less than 24 hours 
      //works even if the value is already within range, or value equal to 24 
      hour = value % MAX_HOUR; 
     } 
    } 
} 
+1

これについて考えるのは簡単ですが、getは宣言されていますが実装されていません。 – Bengie

22

自動プロパティを使用する場合は、設定ツールに独自の実装を提供することはできません。言い換えれば、あなたが行う必要があり、次のいずれか

public int Hour 
{ 
    get { return hour; } 
    set 
    { 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
        "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
       //take the modulus to ensure always less than 24 hours 
       //works even if the value is already within range, or value equal to 24 
       hour = value % MAX_HOUR; 
     } 
    } 
} 
23

y。

私はあなたがこれになりたい疑う:

private int _hour; // backing field 
private int Hour 
    { 
     get { return _hour; } 
     set 
     { 
      //make sure hour is positive 
      if (value < MIN_HOUR) 
      { 
       _hour = 0; 
       MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
       "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
      } 
      else 
      { 
       //take the modulus to ensure always less than 24 hours 
       //works even if the value is already within range, or value equal to 24 
       _hour = value % MAX_HOUR; 
      } 
     } 
    } 

言われて、私はまた、このコードは単純にすることを検討したいということ。それはおそらく、無効な入力のためにあなたのプロパティーセッターの中のMessageBoxではなく例外を使うほうがいいでしょう。特定のUIフレームワークに結びついていないからです。

これが不適切な場合は、プロパティ設定ツールを使用する代わりに、これをメソッドに変換することをお勧めします。これは特に、プロパティには「軽量」という暗黙の期待があり、ユーザーにMessageBoxを実際に表示するとその期待に反してしまうためです。

+2

しかし、 'abstract'、' extern'、または 'partial'で自動ゲッターの実装を使うことは可能でしょうか? –

7

ゲッターとセッターの両方にボディーを提供するか、どちらにもボディーを提供する必要はありません。あなたはセッターのロジックを必要としないことを決定した場合、あなたは自動的に実装さで行くことができる

get { return _hour; } 

:あなたのセッターで非自明なロジックを持っているので、あなたはそうのような手動で実装ゲッターを必要とします次のようなプロパティ:

5

自動コンパイラに基本的な実装を提供したい場合は、getterおよびsetterの本体を用意する必要はありません。

しかし、これはあなたがあなただけのこれを達成するためにkeywork値を使用することができます

<compilers> 
    <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
    <providerOption name="CompilerVersion" value="v3.5"/> 
    <providerOption name="WarnAsError" value="false"/> 
    </compiler> 
</compilers> 
0

ような何かにあなたのweb.configファイルを更新することにより、V3.5コンパイラを使用していることを確認する必要がありません。

public int Hour { 
    get{ 
     // Do some logic if you want 
     //return some custom stuff based on logic 

     // or just return the value 
     return value; 
    }; set { 
     // Do some logic stuff 
     if(value < MINVALUE){ 
      this.Hour = 0; 
     } else { 
      // Or just set the value 
      this.Hour = value; 
     } 
    } 
} 
関連する問題