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>