2

可能重复:
重载解析和虚方法

如果我调用它,为什么要调用对象方法?

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;
     }
}
4

2 回答 2

1

请参阅 C# 4.0 规范 ( https://www.microsoft.com/en-us/download/details.aspx?id=7029 )

7.4 成员查找

首先,确定一组名为 N 的可访问成员:

  • 如果 T 是一个类型参数,则该集合是在每个类型中命名为 N 的可访问成员集的并集,该集合被指定为 T 的主要约束或次要约束(第 10.1.5 节),以及可访问成员集在对象中命名为 N。

  • 否则,该集合由 T 中名为 N 的所有可访问(第 3.5 节)成员组成,包括继承成员和对象中名为 N 的可访问成员。如果 T 是构造类型,则通过替换类型参数获得成员集,如 §10.3.2 中所述。包含 override 修饰符的成员将从集合中排除

我不明白这种行为,但这是在规范中,所以它是正确的,即使有点令人不安(而且我有 C++ 背景)......

编辑:

这确实是一个重复的问题(正如Anders Abel在他的评论中正确发现的那样)。

有关此行为的解释,请参阅原始的重载解决方案和虚拟方法。

于 2012-07-31T08:37:25.800 回答
0

这种方法

public void GetJ(object j)
{
    int j1 = 82;
}

隐藏继承GetJ(int j)是因为(这就是事情的工作方式,除了更明确地打算调用哪个方法之外,没有什么可以做的)当有一个适用的非覆盖方法时,永远不会使用覆盖范围。所以基本上......你的代码按预期工作。

于 2012-07-31T08:23:22.187 回答