假设我有这两个重载函数.
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隐式转换为两float和double,因此两个候选方法都是适用的.然而,从转换int到float从转换"比" int来double根据部分7.5.3.2-7.5.3.5:
给定两种不同类型T1和T2,如果至少有以下一种情况,则T1是比T2更好的转换目标:
- 存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换
- ...... [在这种情况下无关]
在这里,有一个从隐式转换float到double,但是从没有隐式转换double到float-这样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更具体.正如每只动物都可以转化为物体一样,但不是每个物体都可以转化为动物,所以动物更具特异性.
| 归档时间: |
|
| 查看次数: |
690 次 |
| 最近记录: |