繁体   English   中英

重载方法选择逻辑

[英]Overloaded method selection logic

鉴于以下重载方法:

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!"

为什么值结果等于“使用int测试!”而不是“使用对象测试被调用!”?

转换为int比转换为object更“好”,因此使用int的重载比获取object “更好” - 两者都适用,因为short可以隐式转换为intobject (过载走long也很适用,但对转换int比一个更好地long了。)

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

(部分编号来自C#4和C#5版本。您可以下载Word格式的C#5规范 。)

C#规范规则意味着编译器更喜欢将short转换为int ,而不是object 我认为这是由于以下规则来自7.5.3.5更好的转换目标 (链接是C#5规范下载,或者从C#1.2在线查看等效

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

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

要为此场景重写它,因为存在从intobject的隐式转换,并且不存在从objectint隐式转换,转换为int是更好的转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM