C# 重载方法选择逻辑
给定以下重载方法:C# 重载方法选择逻辑,c#,overloading,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!"; } 当我
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
等于“调用了int的Test!”
,而不是“调用了对象的Test!”
为什么值结果等于“调用了一个int的Test!”,而不是“调用了一个object的Test!”
到int
的转换比到object
的转换“更好”,因此使用int
的重载比使用object
的重载“更好”,并且两者都适用,因为short
可以隐式转换为int
和object
。(重载取long
也适用,但到int
的转换也比到long
的转换好。)
通用重载规则见C语言规范第7.5.3节,关于“更好的转换”的规则见第7.5.3.3节。在这里把它们都写出来没有什么意义,因为它们很长-但最重要的方面是从int
到object
的转换,但是没有从object
到int
的转换-所以到int
的转换更具体,因此更好
(节号来自C#4和C#5版本。您可以以Word格式下载。)C#规范规则意味着编译器更喜欢将short
转换为int
,而不是对象。我认为这是由于以下规则(链接到C#5规范下载,或在线查看)
给定两种不同类型的T1和T2,如果至少满足以下条件之一,则T1是比T2更好的转换目标:
- 存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换
- T1是有符号整数类型,T2是无符号整数类型。[其他内容略去]
在这个场景中重写它,因为存在从int
到object
的隐式转换,并且不存在从object
到int
的隐式转换,所以转换到int
是更好的转换。+1-Ah,认为它更喜欢继承而不是转换。很高兴知道,谢谢你链接到C#规范。