【问题标题】:C# "must declare a body because it is not marked abstract, extern, or partial"C#“必须声明一个主体,因为它没有标记为抽象、外部或部分”
【发布时间】:2011-01-26 21:48:43
【问题描述】:

老实说,我不确定为什么会出现这个错误。

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

建议?

【问题讨论】:

  • 快速说明:在 setter 中显示 UI 是一个非常糟糕的主意。
  • 如果你得到了;并设置;那么它是一个汽车属性。如果您定义其中任何一个,它就不再是自动属性。
  • 另外,从我看到的情况来看,此代码在实现 get 访问器后应该抛出 StackOverflowException,因为您没有为您的属性使用支持字段。

标签: c#


【解决方案1】:

您需要为属性的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,因为它不会将您绑定到特定的 UI 框架。

如果这不合适,我建议将其转换为方法而不是使用属性设置器。尤其如此,因为属性具有“轻量级”的隐含期望——而向用户显示 MessageBox 确实违反了这种期望。

【讨论】:

  • 但是是否可以将自动 getter 实现与 abstractexternpartial 一起使用?
【解决方案2】:

在使用自动属性时,您不能为 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;
        }
     }
}

【讨论】:

    【解决方案3】:

    您需要为 getter 和 setter 提供一个主体,或者两者都不提供。由于您的 setter 中有重要的逻辑,因此您需要一个手动实现的 getter,如下所示:

    get { return _hour; }
    

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

    public int Hour { get; set; }
    

    【讨论】:

      【解决方案4】:

      我收到了同样的错误消息,因为我有一个函数,其参数以保留字命名。

         public int SaveDelegate(MyModel.Delegate delegate)
      

      重命名变量委托解决了这个问题。

      【讨论】:

        【解决方案5】:

        试试这个:

        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,但没有实现。
        【解决方案6】:

        您可以只使用 keywork 值来完成此操作。

        public int Hour {
            get{
                // Do some logic if you want
                //return some custom stuff based on logic
        
                // or just return the value
                return value;
            }; set { 
                // Do some logic stuff 
                if(value < MINVALUE){
                    this.Hour = 0;
                } else {
                    // Or just set the value
                    this.Hour = value;
                }
            }
        }
        

        【讨论】:

          【解决方案7】:

          如果您希望自动编译器提供基本实现,则不必为 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>
          

          【讨论】:

            【解决方案8】:

            must declare a body because it is not marked abstract, extern, or partial我在这里遇到了同样的问题:

                private static void swapMth(ref int x, ref int y);
                {
                    int num = x;
                    x = y;
                    y = num;
                }
            
            
                private void button_Click(object sender, EventArgs e)
                {
                    int x = 10;
                    int y = 20;
                    labelResult.Text = $"Befor      n1 = {x} , n2={y} ";
                    swapMth(ref x, ref y);
                    labelResult.Text += $"\n After  n1 = {x} , n2={y}";
                }
            

            通过删除“;”解决了从方法行:

            private static void swapMth(ref int x, ref int y);问题

            private static void swapMth(ref int x, ref int y) 已解决

            我知道这是基本错误,希望有人可以通过此注释获得帮助。

                private static void swapMth(ref int x, ref int y)
                {
                    int num = x;
                    x = y;
                    y = num;
                }
            
            
                private void button_Click(object sender, EventArgs e)
                {
                    int x = 10;
                    int y = 20;
                    labelResult.Text = $"Befor      n1 = {x} , n2={y} ";
                    swapMth(ref x, ref y);
                    labelResult.Text += $"\n After  n1 = {x} , n2={y}";
                }
            

            【讨论】:

            • 你的代码演示了什么,为什么它定义方法而不是属性,为什么它与问题中的代码完全不同?如果您通过删除 ;(从哪里?)解决了您的问题,那么它可能不是同一个问题。
            • 您好!谢谢你们的cmets。这是图片i.stack.imgur.com/5idNW.png和标题一样的问题
            • 不过,除了标题之外,还有更多问题。如果您也阅读正文,您会发现这个问题专门针对属性,没有提及方法。您建议从问题中的代码中删除什么; 以解决该问题?删除其中任何一个都会导致编译器错误。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多