假设我有这两个重载函数。
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");
}
为什么编译器会选择浮点函数?
答案 0 :(得分:22)
遵循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
。
答案 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更具体。就像每只动物都可以转化为物体一样,但不是每个物体都可以转化为动物,所以动物更具特异性。