重载方法选择逻辑

Kar*_*son 4 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!";
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时Test(),传递一个short,像这样:

short shortValue = 7;
var result = Test(shortValue);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

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

转换int为" 转换为"比转换为"更好" object,因此重载int比" 采用"更好" object- 两者都适用,因为它short可以隐式转换为intobject.(过载long也适用,但转换intlong也要好.)

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

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