Подтвердить что ты не робот

С# "должно объявить тело, потому что оно не отмечено абстрактным, внешним или частичным"

Я не уверен, почему я получаю эту ошибку, если честно.

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

Я также пробовал просто делать фактическое свойство:

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

Предложения?

4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

Вам нужно предоставить тело для части get;, а также часть set; свойства.

Я подозреваю, что вы хотите, чтобы это было:

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 внутри вашего установщика свойств для недопустимого ввода, поскольку он не привяжет вас к определенной структуре пользовательского интерфейса.

Если это неуместно, я бы рекомендовал преобразовать это в метод вместо использования средства настройки свойств. Это особенно верно, поскольку свойства имеют неявное ожидание быть "легким" - и отображение MessageBox пользователю действительно нарушает это ожидание.

Ответ 3

Вы не можете предоставить свою собственную реализацию для установщика при использовании автоматических свойств. Другими словами, вы должны либо сделать:

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

или предоставить свою собственную реализацию как для getter, так и для setter, что вы хотите, судя по вашему примеру:

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

Ответ 4

Вам нужно либо предоставить тело как для геттера, так и для сеттера, либо нет. Поскольку у вас нет нетривиальная логика в вашем сеттере, вам нужен вручную реализованный геттер, например:

get { return _hour; }

Если вы решите, что вам не нужна логика в сеттер, вы можете пойти с автоматически реализованным свойством:

public int Hour { get; set; }

Ответ 5

Вам НЕ нужно предоставлять тело для геттеров и сеттеров, если вы хотите, чтобы автоматизированный компилятор предоставил базовую реализацию.

Это, однако, требует от вас убедиться, что вы используете компилятор v3.5, обновив файл web.config примерно на

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