如果我这样称呼,为什么要调用对象方法?
Classes.Class2 c = new Classes.Class2();
c.GetJ(1);
public class Class1
{
public virtual void GetJ(int j)
{
}
}
class Class2:Class1
{
public override void GetJ(int j)
{
int j3 = 8;
}
public void GetJ(object j)
{
int j1 = 82;
}
}
答案 0 :(得分:1)
请参阅C#4.0规范(https://www.microsoft.com/en-us/download/details.aspx?id=7029)
7.4会员查询
首先,确定一组名为N的可访问成员:
如果T是一个类型参数,则该集合是指定为T的主要约束或次要约束(第10.1.5节)的每种类型中名为N的可访问成员集合的并集,使用对象中名为N的可访问成员集。
- 中排除
否则,该集由T中名为N的所有可访问(§3.5)成员组成,包括继承成员和对象中名为N的可访问成员。如果T是构造类型,则通过替换类型参数来获得成员集,如第10.3.2节中所述。 包含覆盖修饰符的成员将从集合。
我不明白这种行为,但这是在规范中,所以它是正确的,即使有点令人不安(我有一个C ++背景)......
这确实是一个重复的问题(正如Anders Abel在评论中正确发现的那样)。
有关此行为的说明,请参阅原始Overload resolution and virtual methods。
答案 1 :(得分:0)
此方法
public void GetJ(object j)
{
int j1 = 82;
}
隐藏了继承的GetJ(int j)
,因为(这就是事情的工作原理,除了在一个打算调用的方法中更明确外,没有太多可以做的事)覆盖永远不会在同一范围内存在适用的非重写方法时使用。基本上......你的代码按预期工作。