【发布时间】:2014-08-18 18:57:46
【问题描述】:
给定以下两个重载方法签名:
public B DoSomething<A,B>(A objOne, B objTwo)
public object DoSomething(object objOne, Type objType);
我希望调用它会调用第二个签名,但它不会:
var obj = new SomeType();
var type = typeof(SomeOtherType);
DoSomething(obj, type);
在我看来,查看规范,第二个重载更适用(具有一种确切的类型和较少的数量)。但是,它不会被调用。相反,调用第一个重载时,A 为 object 类型,B 为 Type 类型。为什么会这样?除了重命名方法或使用命名参数之外,还有其他方法可以调用此方法吗?
编辑:
以下是我在 7.5.3.2 中引用的规范部分:
如果参数类型序列 {P1, P2, ..., PN} 和 {Q1, Q2, ..., QN} 等价(即每个 Pi 有一个到相应 Qi 的恒等转换),以下平局规则应用,以便确定更好的功能成员。
- 如果 MP 是非泛型方法而 MQ 是泛型方法,则 MP 优于 MQ。
- ...
- 否则,如果 MP 比 MQ 有更具体的参数类型,则 MP 优于 MQ。令 {R1, R2, ..., RN} 和 {S1, S2, ..., SN} 表示 MP 和 MQ 的未实例化和未扩展的参数类型。 MP 的参数类型比 MQ 的更具体,如果对于每个参数,RX 不低于 SX,并且,对于至少一个参数,RX 比 SX 更具体:
- 类型参数不如非类型参数具体。
- ...
【问题讨论】:
-
您可以在问题中添加更多信息吗?我在 LinqPad 中运行代码并使用了非泛型重载。显示的代码(+编译所需的最少数量)不会重现您的问题。
-
查看@Jon Skeet 对this question 的回答。
-
@hunch_hunch 我不确定这里的情况是否完全一样。
-
@anthony-pegram 抱歉,我不应该将 obj 设为对象的类型。我已更新问题以更准确地反映问题。
-
好吧,如果类型不是对象,那么调用泛型重载是完全可以理解的,因为它完全匹配而非泛型重载不匹配。
标签: c# generics overloading