为什么在没有覆盖产生警告并进行覆盖时覆盖关键字会产生错误?

Why override keyword produces error when no override produces warning and do overriding?

下面的代码产生错误,无法编译。但是当我们删除 override 关键字时,它只会产生警告、编译甚至覆盖。

有什么合乎逻辑的解释吗?

class Baseclass
{
    public void fun()
    {
        Console.WriteLine("Hi ");
    }

    public void fun(int i)
    {
        Console.Write("Hello ");
    }
}


class Derived : Baseclass
{
    public override void fun()
    {
        Console.Write("Bye ");
    }
}


class MyProgram
{
    static void Main(string[] args)
    {
        Derived d;
        d = new Derived();
        d.fun();
        d.fun(77);
        Console.Read();
    }
} 

在 C# 中,您只能覆盖标记为虚拟的方法。试试这个

class Baseclass
{
    public virtual void fun()
    {
        Console.WriteLine("Hi ");
    }
}


class Derived : Baseclass
{
    public override void fun()
    {
        Console.Write("Bye ");
    }
}

当您将 override 放入函数签名中时,编译需要基 class 中不存在的匹配虚方法(签名和 return 类型),因此出现错误提出。

当您删除实际上隐藏 BaseClass 方法但不会覆盖它的覆盖关键字时。在这种情况下,编译器只会发出警告并继续编译。

覆盖和隐藏之间有一点区别请参阅Overriding vs method hiding了解更多详情

C# 包含一个关键字 virtual,它允许您将成员标记为在派生的 classes 中被覆盖。

文档中所述的原因是:

By default, methods are non-virtual. You cannot override a non-virtual method.

为什么语言设计者要这样做,你必须明确声明一个方法可以被覆盖?我不能代表他们说话,但很明显他们想给程序员一个安全的方法来避免错误地覆盖成员。这似乎是这里最明显的胜利。

因此,在设计 class 时,您应该将 class 标记为您认为被有用地覆盖为虚拟的。

您可以在 MSDN 上阅读更多内容。

所以你的 Baseclass 看起来像这样:

class Baseclass
{
    public virtual void fun()
    {
        Console.WriteLine("Hi ");
    }

    public void fun(int i)
    {
        Console.Write("Hello ");
    }
}

当然,您也可以将 virtual 添加到采用 int 的重载方法中。