4

给定以下重载方法:

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

4

2 回答 2

7

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

转换为int比转换为“更好” object,因此重载int比采用的“更好” object- 两者都适用,因为short它可以隐式转换为intand object。(重载long也适用,但转换为int也比转换好long。)

有关一般重载规则,请参阅 C# 语言规范的第 7.5.3 节,有关“更好的转换”的规则,请参阅第 7.5.3.3 节。把它们都写在这里没有什么意义,因为它们很长——但最重要的方面是有从到的转换intobject但没有从objectint的转换——所以转换到int更具体,因此更好。

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

于 2013-09-25T17:55:54.160 回答
2

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

给定两种不同类型的 T1 和 T2,如果以下至少一项成立,则 T1 是比 T2 更好的转化目标:

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

要针对这种情况重写它,因为存在隐式转换 from inttoobject并且不存在隐式转换 from objectto int,因此转换为int更好的转换。

于 2013-09-25T17:58:39.543 回答