Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重载方法选择逻辑_C#_Overloading - Fatal编程技术网

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#规范。