为什么传递整数与对象方法而不是基本类型方法匹配

时间:2012-07-31 08:15:37

标签: c#

  

可能重复:
  Overload resolution and virtual methods

如果我这样称呼,为什么要调用对象方法?

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

2 个答案:

答案 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),因为(这就是事情的工作原理,除了在一个打算调用的方法中更明确外,没有太多可以做的事)覆盖永远不会在同一范围内存在适用的非重写方法时使用。基本上......你的代码按预期工作。