我的课程Foo
中有一个功能myName
类bar
继承自Foo
并拥有一个名为myName
的属性
我认为这应该没问题,因为:
get_myName()
(因此不会与Foo::myName(int,int)
发生冲突)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()
的所有重载?
答案 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”的定义