方法重载。它是如何工作的?

时间:2012-01-04 22:37:30

标签: c# overloading

假设我有这两个重载函数。

public static void Main(string[]args)
{
     int x=3;
     fn(x); 
}

static void fn(double x)
{ 
    Console.WriteLine("Double");
}

static void fn(float x)
{
    Console.WriteLine("Float");
}

为什么编译器会选择浮点函数?

2 个答案:

答案 0 :(得分:22)

遵循C#4规范第7.5.3.2节的规则。

int可隐式转换为floatdouble,因此两种候选方法均适用。但是,根据第7.5.3.2-7.5.3.5节,从intfloat的转换“优于”从intdouble的转换:

  

鉴于T1和T2两种不同的类型,如果至少有以下一种情况,则T1是比T2更好的转换目标:

     
      
  • 存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换
  •   
  • ...... [在这种情况下无关]
  •   

此处有从floatdouble的隐式转换,但没有从doublefloat的隐式转换 - 所以float是更好的转换目标比double

答案 1 :(得分:11)

当然,乔恩的回答是正确的。添加更多细节:这里的设计原则是“更具体”的方法更好。如果你有:

void M(object x){}
void M(Animal x){}
void M(Giraffe x){}

你打电话给M(new Giraffe())显然你想要完全匹配。如果你打电话给M(new Tiger()),最好的匹配是“动物”,因为老虎是一种动物,老虎是一种物体,但动物比对象更具体。我们怎么知道动物比对象更具体?因为每只动物都是一种物体,但不是每一种物体都是动物,所以动物必须更加具体。

如果您致电M(null),我们会选择长颈鹿版本。长颈鹿比动物更具特异性,因为每只长颈鹿都是动物,但不是每只动物都是长颈鹿。

在您的示例中,float优于double,因为它更具体。每个浮点数都可以转换为double,但不是每个double都可以转换为float,因此float更具体。就像每只动物都可以转化为物体一样,但不是每个物体都可以转化为动物,所以动物更具特异性。