C#"必须声明一个正文,因为它没有标记为抽象,外部或部分"

Dav*_*wer 51 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也试过做一个实际的财产:

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;
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

建议?

Tom*_*son 36

试试这个:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一种更容易思考的方法是声明get,但是没有实现. (2认同)

Ree*_*sey 27

您需要为该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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我也考虑让这个代码更简单.最好在属性设置器中使用异常而不是MessageBox来进行无效输入,因为它不会将您绑定到特定的UI框架.

如果这是不合适的,我建议将其转换为方法而不是使用属性设置器.这尤其正确,因为属性具有"轻量级"的隐含期望 - 并且向用户显示MessageBox确实违反了该期望.

  • 但是可以使用`abstract`,`extern`或`partial`来实现自动getter实现吗? (4认同)

dri*_*iis 26

使用自动属性时,无法为setter提供自己的实现.换句话说,你应该这样做:

public int Hour { get;set;} // Automatic property, no implementation
Run Code Online (Sandbox Code Playgroud)

或者为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;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)


jas*_*son 8

你需要为getter和setter提供一个body,或者两者都不提供.由于你的setter中有非平凡的逻辑,你需要一个手动实现的getter,如下所示:

get { return _hour; }
Run Code Online (Sandbox Code Playgroud)

如果您决定不需要setter中的逻辑,那么您可以使用自动实现的属性,如下所示:

public int Hour { get; set; }
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您希望自动编译器提供基本实现,则不必为getter和setter提供正文.

但是,这需要您确保通过将web.config更新为类似的方式来使用v3.5编译器

 <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>
Run Code Online (Sandbox Code Playgroud)