C#“必须声明一个主体,因为它没有被标记为抽象的,外部的或者部分的”
我不知道为什么我得到这个错误是诚实的。
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; } } }
build议?
尝试这个:
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; } } }
你需要提供一个get;
的机构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; } } }
这就是说,我也考虑使这个代码更简单。 在属性设置器中使用exception而不是MessageBox可能更好,因为它不会将您绑定到特定的UI框架。
如果这是不合适的,我会build议将其转换为一种方法,而不是使用属性设置器。 这是因为属性有一个隐含的期望是“轻量级的”,并向用户显示一个MessageBox真的违反了这个期望。
使用自动属性时,您无法为setter提供您自己的实现。 换句话说,你应该做:
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; } } }
你需要为getter和setter提供一个正文,或者都不要。 既然你在setter中有不平凡的逻辑,你需要一个手动执行的getter,像这样:
get { return _hour; }
如果你决定你不需要setter中的逻辑,你可以使用一个自动实现的属性,如下所示:
public int Hour { get; set; }
如果您希望自动编译器提供基本的实现,则不必为getter和setter提供一个实体。
但是,这需要你确保你正在使用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>