重载方法选择逻辑

时间:2013-09-25 17:51:45

标签: c# overloading

鉴于以下重载方法:

public string Test(long item)
{
    return "Test with a long was called!";
}

public string Test(int item)
{
    return "Test with an int was called!";
}

public string Test(object item)
{
    return "Test with an object was called!";
}

当我致电Test()时,传递short,就像这样:

short shortValue = 7;
var result = Test(shortValue);

为什么值result等于"Test with an int was called!"而不是"Test with an object was called!"

2 个答案:

答案 0 :(得分:7)

  

为什么值结果等于“调用带有int的测试!”,而不是“调用带有对象的测试!”?

转换为int比转换为object“更好”,因此int的重载比采用object的重载“更好” - 两者都是适用,short可隐式转换为intobject。 (过载long也适用,但转换为int的效果也优于long

有关一般重载规则,请参阅C#语言规范的7.5.3节;有关“更好的转换”的规则,请参阅7.5.3.3。将它们全部写在这里没有什么意义,因为它们很长 - 但最重要的方面是从int转换为object但没有从object转换为{ {1}} - 因此转换为int更具体,因此更好。

(章节编号来自C#4和C#5版本。您可以以Word格式下载C# 5 spec。)

答案 1 :(得分:2)

C#规范规则意味着编译器更喜欢将short转换为int,而不是object。我认为这是由于7.5.3.5 Better conversion target中的以下规则(链接到C#5规范下载,或在线查看equivalent from C# 1.2

  

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

     
      
  • 存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换
  •   
  • T1是有符号整数类型,T2是无符号整数类型。 [其他内容省略]
  •   

要为此方案重写,因为存在从intobject的隐式转换,并且不存在从objectint的隐式转换,转换为{{ 1}}是更好的转换。