覆盖虚拟方法

时间:2016-06-05 12:17:23

标签: c# override virtual tostring

override方法的签名与原始基类System.Object中的签名相同,因为签名只包含方法的名称以及参数的类型和数量。

为什么有必要使用相同的返回类型来覆盖方法?

using System;

namespace Testing_Override_Keyword
{
    class OverridingClass
    {

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

这是错误

  

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

2 个答案:

答案 0 :(得分:4)

  

为什么有必要使用相同的返回类型来覆盖方法?

从某种意义上说,"因为那是语言规范所说的"。从C#5规范部分10.6.4:

  

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

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

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

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

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

如何处理您的覆盖?

答案 1 :(得分:0)

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