3

我有一个Foo带有函数的类myName
bar继承自Foo并具有一个属性,该属性也称为myName

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

  1. 属性将编译get_myName()(因此不会与 冲突Foo::myName(int,int)
  2. Foo::myName有论据,而显然,该属性没有(同样,没有冲突)。

但是我仍然收到警告:

'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()

4

2 回答 2

4

C# 规范的第 10.3.3 节包含:

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

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

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

在同一个类中,我们遇到了 10.3 节的规则:

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

10.3.9.1 节中提到了您不能声明被调用的方法这一事实get_myName,如注释中所述。

于 2013-08-01T06:35:04.060 回答
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”的定义

于 2013-08-01T06:34:48.833 回答