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

Sle*_*idi 11 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");
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 22

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

int隐式转换为两floatdouble,因此两个候选方法都是适用的.然而,从转换intfloat从转换"比" intdouble根据部分7.5.3.2-7.5.3.5:

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

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

在这里,有一个从隐式转换floatdouble,但是从没有隐式转换doublefloat-这样float是不是更好的转换目标double.


Eri*_*ert 11

乔恩的回答当然是对的.添加更多细节:这里的设计原则是"更具体"的方法更好.如果你有:

void M(object x){}
void M(Animal x){}
void M(Giraffe x){}
Run Code Online (Sandbox Code Playgroud)

而且你M(new Giraffe())明显要求你想要完全匹配.如果你打电话M(new Tiger()),最好的匹配是"动物",因为老虎是一种动物,老虎是一种物体,但动物比物体更具体.我们怎么知道动物比物体更具体?因为每只动物都是一个物体,但不是每个物体都是动物,所以动物必须更加具体.

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

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