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

C# 方法重载。它是如何工作的?,c#,overloading,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"); } 编译器为什么选择浮点函数?它遵循C#4规范第7.5.3.2节的规则 int隐式转换为f

假设我有这两个重载函数

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

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

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

int
隐式转换为
float
double
,因此这两种候选方法都适用。但是,根据第7.5.3.2-7.5.3.5节,从
int
float
的转换“优于”从
int
double
的转换:

给定两种不同类型的T1和T2,如果至少满足以下条件之一,则T1是比T2更好的转换目标:

  • 存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换
  • 。。。[与本案无关]

在这里,有一个从
float
double
的隐式转换,但没有从
double
float
的隐式转换-因此
float
double

Jon的答案当然是正确的。更详细一点:这里的设计原则是“更具体”的方法更好。如果你有:

void M(object x){}
void M(Animal x){}
void M(Giraffe x){}
您调用了
M(new Giraffe())
,显然您需要精确匹配。如果调用
M(new Tiger())
,最好的匹配是“动物”,因为老虎是一种动物,老虎是一种对象,但动物比对象更具体。我们怎么知道动物比物体更具体?因为每一个动物都是一个物体,但不是每一个物体都是动物,所以动物必须更具体

如果您调用
M(null)
,我们将因此选择长颈鹿版本。长颈鹿比动物更具体,因为每只长颈鹿都是动物,但不是每只动物都是长颈鹿


在您的示例中,float优于double,因为它更具体。每个float都可以转换为double,但不是每个double都可以转换为float,所以float更具体。正如每个动物都可以转化为对象,但不是每个对象都可以转化为动物,所以动物更具体。

更好的意思是什么??尺寸更接近?@sleimanjneidi:Better的意思是“根据规范更好”——这只是一个术语。在这里,从某种意义上说,它的真正含义是“更具体”。。。但实际上,你应该从规范规则的角度来考虑,我想。@JonSkeet:Quick question wrt你回答的最后一句话是:为什么从
float
double
的转换是相关的?编译器不是必须决定从int到float的转换还是从int到double的转换更好吗?M(null)不是一个模棱两可的调用?@sleimanjneidi:不,我刚才说了为什么它不是模棱两可的。有三种适用的方法。最具体的一个赢了。比如说,如果方法是M(string)、M(Giraffe)和M(int?),那么M(null)将是不明确的,因为string、Giraffe和int?不比彼此更具体或更不具体。