【问题标题】:must declare a body because it is not marked abstract extern or partial必须声明一个主体,因为它没有标记为抽象外部或部分
【发布时间】:2016-03-17 11:02:38
【问题描述】:

我有代码并收到上面显示的错误。但是这个类被定义为抽象的,所以我不需要代码体。

public abstract class Endian
    {
        public short ToInt16(byte[] value, int startIndex)
        {
            return unchecked((short)FromBytes(value, startIndex, 2));
        }

        public int ToInt32(byte[] value, int startIndex)
        {
            return unchecked((int)FromBytes(value, startIndex, 4));
        }

        public long ToInt64(byte[] value, int startIndex)
        {
            return FromBytes(value, startIndex, 8);
        }

        // This same method can be used by int16, int32 and int64.
        protected virtual long FromBytes(byte[] buffer, int startIndex, int len); // << Error here
    }

【问题讨论】:

    标签: c#


    【解决方案1】:

    virtual 修饰符用于指示方法可以在派生类中被覆盖,但需要在基类中定义(即通过给它一个方法体)。如错误消息所示,您想使用abstract 修饰符而不是virtual,这意味着方法必须被覆盖。

    抽象的方法必须具有abstract 修饰符,即使该类已经被标记为abstract 以便清楚地区分它们,并且它们不能包含方法主体(只是末尾的分号)。这只是规则,它就是这样。

    【讨论】:

      【解决方案2】:

      为了抽象,方法必须这样声明:

      protected abstract long FromBytes(byte[] buffer, int startIndex, int len);
      

      你在哪里声明它是虚拟的,这意味着它是一个适当的方法,有一个实现,可以被派生类覆盖。

      【讨论】:

        【解决方案3】:

        但是类被定义为抽象的,所以我不应该需要代码体。

        为什么会这样?

        protected virtual long FromBytes(byte[] buffer, int startIndex, int len);

        方法仍然被标记为虚拟,它需要一个主体并且可以被覆盖。如果您不想添加定义,则应将其声明为抽象。

        【讨论】:

          猜你喜欢
          • 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
          相关资源
          最近更新 更多