c#

C#"debe declarar un cuerpo porque no está marcado como abstracto, externo o parcial"



(6)

No estoy seguro de por qué obtengo este error para ser honesto.

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

También intenté 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?


Debe proporcionar un cuerpo para el get; porción, así como el set; porción de la propiedad.

Sospecho que quieres 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 consideraría hacer este 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.


NO es necesario proporcionar un cuerpo para getters y setters SI desea que el compilador automatizado brinde una implementación básica.

Sin embargo, esto requiere que se asegure de estar utilizando el compilador v3.5 actualizando su web.config a 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>


Necesita proporcionar un cuerpo para el comprador y el colocador, o ninguno. Como tienes una lógica no trivial en tu setter, necesitas un getter implementado manualmente así:

get { return _hour; }

Si decides que no necesitas la lógica en el setter, puedes ir con una propiedad implementada automáticamente así:

public int Hour { get; set; }


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

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

o proporcione su propia implementación tanto para getter como para setter, que es lo que quiere juzgar a partir de 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; } } }


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


Puede usar el valor de la clave 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; } } }