【问题标题】:Method overloading. How does it work?方法重载。它是如何工作的?
【发布时间】:2012-01-05 07:11:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# overloading


    【解决方案1】:

    它遵循 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 更好的转换目标。

    【讨论】:

    • 更好是什么意思??尺寸更接近?
    • @sleimanjneidi:更好的意思是“根据规范更好”——这只是一个术语。在这里,它在某种意义上确实意味着“更具体”......但实际上你应该根据规范规则来考虑它,IMO。
    • @JonSkeet:回答中最后一句话的快速问题:为什么从floatdouble 的转换完全相关?编译器不需要决定是int到float的转换还是int到double的转换更好吗?
    【解决方案2】:

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

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

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

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

    在您的示例中,float 比 double 更好,因为它更具体。每个浮点数都可以转换为双精度,但不是每个双精度都可以转换为浮点数,所以浮点数更具体。正如每一种动物都可以转化为物体,但不是每一种物体都可以转化为动物,所以动物更具体。

    【讨论】:

    • M(null) 不是一个模棱两可的电话吗?
    • @sleimanjneidi:不,我只是说为什么它不是模棱两可的。适用的方法有以下三种。最具体的获胜。比如说,如果方法是 M(string)、M(Giraffe) 和 M(int?),那么 M(null) 将是模棱两可的,因为 string、Giraffe 和 int?不比彼此更具体。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2015-07-27
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多