为什么属性隐藏具有相同名称的Inherited函数?

时间:2013-08-01 06:29:39

标签: c# .net inheritance properties

我的课程Foo中有一个功能myNamebar继承自Foo并拥有一个名为myName的属性

我认为这应该没问题,因为:

  1. property will compileget_myName()(因此不会与Foo::myName(int,int)发生冲突)
  2. Foo::myName有论据,显然,财产没有(再次,没有彻底)。
  3. 然而我仍然收到警告:

    'Bar.myName' hides inherited member 'Foo.myName(int, int)'. Use the new keyword if hiding was intended.
    

    示例代码:

    public class Foo
    {
        public int myName(int a, int b)
        {
            return 0;
        }
    }
    
    class Bar: Foo
    {
        int a;
        int b;
    
        int myName
        {
            get
            {
                return a + b;
            }
        }
    }
    

    另外,如果我添加bar函数:

    int get_myName() 
    {
        return a+b;
    }
    

    正如预期的那样,我收到有关先前声明的函数的错误 那么这里发生了什么?除了myName之外,该属性是否允许我使用get_myName()的所有重载?

2 个答案:

答案 0 :(得分:4)

C#规范的第10.3.3节包含:

  

派生类可以通过声明具有相同名称或签名的新成员来隐藏继承的成员。

它没有说两个成员必须是同一类成员。请注意,即使一个属性是属性而一个是方法,但仍然存在可能混淆的情况:

  • 该属性可以是委托类型,例如Action<int, int> PropertyName(10, 10)在这种情况下get_myName有效。
  • 在某些使用属性名称的地方,您可能尝试执行方法组转换,因此它们都有效。

在同一个班级中,我们会遇到第10.3节的规则:

  
      
  • 常量,字段,属性,事件或类型的名称必须与同一类中声明的所有其他成员的名称不同。
  •   
  • 方法的名称必须与同一类中声明的所有其他非方法的名称不同。 [...]
  •   

如评论中所述,第10.3.9.1节提到了无法声明名为{{1}}的方法这一事实。

答案 1 :(得分:0)

我们甚至不需要图片中的继承 - 你不能在属性和方法之间有“重载”:

class Program
{
    static void Main(string[] args)
    {

        Console.ReadLine();
    }

    void DoStuff(int i,int j)
    {

    }

    int DoStuff { get { return 10; } }
}

产地:

  

错误CS0102:“ConsoleApplication4.Program”类型已包含“DoStuff”的定义