重载方法选择逻辑
鉴于以下重载方法:
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!"
?
为什么值结果等于“使用int测试!”而不是“使用对象测试被调用!”?
转换为int
比转换为object
更“好”,因此重载int
取代“取向object
”更好 – 并且两者都适用,因为short
可以隐式转换为int
和object
。 (过载需要long
也适用,但转换为int
也要比int
更好。)
有关一般重载规则,请参阅C#语言规范的7.5.3节;有关“更好的转换”的规则,请参阅7.5.3.3。 将它们全部写在这里没有什么意义,因为它们很长 – 但最重要的方面是从int
转换为object
但没有从object
转换为int
– 因此转换为int
更具体,因此更好。
(部分编号来自C#4和C#5版本。您可以下载Word格式的C#5规范 。)
C#规范规则意味着编译器更喜欢将short
转换为int
,而不是object
。 我认为这是由于7.5.3.5以下规则更好的转换目标 (链接到C#5规范下载,或者从C#1.2在线查看等效 )
给定两种不同类型T1和T2,如果至少有以下一种情况,则T1是比T2更好的转换目标:
要为此场景重写它,因为存在从int
到object
的隐式转换,并且不存在从object
到int
隐式转换,转换为int
是更好的转换。
上述就是C#学习教程:重载方法选择逻辑分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030800.html