2011-01-26 177 views
40

No estoy seguro de por qué obtengo este error para ser sincero.C# "debe declarar un cuerpo porque no está marcado como abstracto, externo o parcial"

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

He intentado también acaba de hacer una propiedad real:

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

Sugerencias?

+0

duplicado: 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 nota rápida: es una mala idea mostrar UI en un setter. – driis

+8

si obtienes; y establecer; entonces es una propiedad de auto. si define cualquiera, ya no es una propiedad de auto. – JDPeckham

Respuesta

28

intente esto:

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

Una manera más fácil de pensarlo es declarar, pero no implementar. – Bengie

22

No puede proporcionar su propia implementación para el colocador cuando usa propiedades automáticas. En otras palabras, usted debe ya sea hacer:

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

o proporcionar su propia aplicación tanto para el getter y setter, que es lo que quiere juzgar por su ejemplo:

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

es necesario proporcionar un cuerpo para la parte get;, así como la parte de la propert y

sospecho que desea que esto sea:

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

Dicho esto, también me gustaría considerar hacer el código más simple. Probablemente sea mejor usar excepciones en lugar de un MessageBox dentro de su configurador de propiedades para entradas no válidas, ya que no lo vinculará a un marco de UI específico.

Si eso no es apropiado, recomendaría convertir esto a un método en lugar de usar un setter de propiedades. Esto es especialmente cierto ya que las propiedades tienen una expectativa implícita de ser "livianas", y mostrar un MessageBox al usuario realmente infringe esa expectativa.

+2

Pero, ¿sería posible usar la implementación getter automática con 'abstract',' extern', o 'partial'? –

7

Debe proporcionar un cuerpo para el captador y el colocador, o ninguno. Puesto que usted tiene lógica no trivial en su organismo, es necesario un captador aplicado manualmente, así:

get { return _hour; } 

Si decide que no necesita la lógica en la incubadora, usted podría ir con una implementado automáticamente propiedad de este modo:

public int Hour { get; set; } 
5

usted NO tiene que proporcionar un cuerpo de captadores y definidores Si desea que el compilador automatizado para proporcionar una implementación básica.

Esto requiere sin embargo que para asegurarse de que está utilizando el compilador v3.5 mediante la actualización de su web.config para algo así como

<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

Usted sólo puede usar el valor keywork para lograr esto.

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