鉴于以下重载方法:
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!"
?
答案 0 :(得分:7)
为什么值结果等于“调用带有int的测试!”,而不是“调用带有对象的测试!”?
转换为int
比转换为object
“更好”,因此int
的重载比采用object
的重载“更好” - 两者都是适用,short
可隐式转换为int
和object
。 (过载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是无符号整数类型。 [其他内容省略]
要为此方案重写,因为存在从int
到object
的隐式转换,并且不存在从object
到int
的隐式转换,转换为{{ 1}}是更好的转换。