С# "должно объявить тело, потому что оно не отмечено абстрактным, внешним или частичным"
Я не уверен, почему я получаю эту ошибку, если честно.
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;
}
}
}
Предложения?
Ответы
Ответ 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>