2011-01-26 25 views
40

Non sono sicuro del motivo per cui sto ricevendo questo errore per essere onesto.C# "deve dichiarare un corpo perché non è contrassegnato come astratto, extern o parziale"

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; 
     } 
    } 
} 

Ho anche provato solo facendo una effettiva proprietà:

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; 
     } 
    } 
} 

Suggerimenti?

+0

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

+32

Una breve nota: è davvero una cattiva idea visualizzare l'interfaccia utente in un setter. – driis

+8

se si ottiene; e impostare; allora è una proprietà auto. se ne definisci uno, non è più una proprietà automatica. – JDPeckham

risposta

28

Prova questa:

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

Un modo più semplice per pensarci, è ottenere viene dichiarato, ma non implementato. – Bengie

22

Non è possibile fornire la propria implementazione per il setter quando si utilizzano le proprietà automatiche. In altre parole, si dovrebbe neanche fare:

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

o forniscono una propria implementazione sia per il getter e setter, che è ciò che si vuole giudicare dal vostro esempio:

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

è necessario fornire un corpo per la porzione get; così come la porzione del propert y.

ho il sospetto che si desidera che questo sia:

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; 
      } 
     } 
    } 

Detto questo, mi piacerebbe anche considerare rendendo questo codice più semplice. Probabilmente è meglio usare le eccezioni piuttosto che un MessageBox all'interno del tuo setter di proprietà per input non validi, in quanto non ti legherà a un framework UI specifico.

Se ciò non è appropriato, ti consigliamo di convertirlo in un metodo invece di utilizzare un setter di proprietà. Ciò è particolarmente vero poiché le proprietà hanno un'aspettativa implicita di essere "leggere" e la visualizzazione di un MessageBox all'utente viola effettivamente tale aspettativa.

+2

Ma sarebbe possibile utilizzare l'implementazione getter automatica con 'abstract',' extern' o 'partial'? –

7

È necessario fornire un corpo sia per il getter e setter, o entrambi. Dal momento che si dispone di logica non banale nella vostra setter, è necessario un getter manualmente attuate in questo modo:

get { return _hour; } 

Se si decide che non è necessario la logica nel setter, si potrebbe andare con un automatico attuate proprietà in questo modo:

public int Hour { get; set; } 
5

NON è necessario fornire un corpo di getter e setter se si desidera che il compilatore automatizzato per fornire un'implementazione di base.

Ciò tuttavia richiede di assicurarsi che si sta utilizzando il compilatore v3.5 aggiornando il tuo web.config a qualcosa di simile

<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

Si può semplicemente utilizzare il valore keywork per raggiungere questo obiettivo.

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; 
     } 
    } 
} 
Problemi correlati