【问题标题】:Overriding virtual method重写虚方法
【发布时间】:2016-10-05 03:19:02
【问题描述】:

重写方法的签名与原始基类System.Object中的签名相同,因为签名只包括方法的名称和它所接受的参数类型和数量。

为什么需要相同的返回类型来覆盖一个方法?

using System;

namespace Testing_Override_Keyword
{
    class OverridingClass
    {

        public override int ToString()//**Here is error**
        {
            return 1;
        }
    }
}

这是错误

返回类型必须是字符串以匹配被覆盖的成员

【问题讨论】:

标签: c# overriding virtual tostring


【解决方案1】:

为什么重写一个方法需要相同的返回类型?

从某种意义上说,“因为这是语言规范所说的”。来自 C# 5 规范第 10.6.4 节:

除非对覆盖声明满足以下所有条件,否则会发生编译时错误:

  • ...
  • 覆盖方法和被覆盖的基方法具有相同的返回类型。

在另一种意义上,“因为否则它就没有意义”。关键是调用者应该能够调用虚方法——包括使用返回值——而不用关心它是否被覆盖。

想象一下,如果有人写过:

object x = new OverridingClass();
string y = x.ToString();

这将如何与您的覆盖一起使用?

【讨论】:

    【解决方案2】:

    虚拟方法ToString()返回string,但在你的情况下你返回int,这不是同一个签名,因此你有一个编译错误。

    【讨论】:

    • 不,返回类型不是 signature 的一部分——这就是 OP 的困惑所在。 (他们是对的 - 但返回类型需要匹配以及签名。)
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多