C#如何在方法调用中的多个接口之间消除歧义?

问题描述:

假设我有一个继承自2个接口(I1I2)的类C。我也有两个版本的方法(DoStuff),每个方法都将一个接口作为参数。如果我打电话给DoStuff(C),哪个人打电话?C#如何在方法调用中的多个接口之间消除歧义?

interface I1 { ... } 
interface I2 { ... } 
class C : I1, I2 { ... } 

int DoStuff(I1 target) { ... } 
int DoStuff(I2 target) { ... } 

//What gets called here? 
C target = new C() 
DoStuff(target) 

如果I2I1派生,我认为这是比较简单 - I2版本被调用。我对接口是独立的情况感兴趣。

假设我不能编辑C,I1I2。和.NET 2.0,如果这有什么区别。

+1

一个非常有趣的问题! – trampi

+3

-1在问这个问题之前,你显然没有测试自己。 –

+0

有关运行时会发生什么的问题需要关于实际编译的代码! (并且我不是在谈论椭圆!) – AakashM

都不被调用。如果你的两个方法在同一个类中是重载的,那么编译器根本不会试图消除歧义。它不会编译你的代码,说你的两个过载之间是不明确的,因为你声明target是一个类型,它实现了两个接口。

如果您声明target是接口类型之一,或者在调用时抛出它(如Jon所示),那么就没有歧义。

+0

+1。我假设对DoStuff的调用是可以编辑的(否则它不会编译),所以对I1或I2进行强制转换将解决您的问题。 –

正如BoltClock所说,它不会编译。然而,很容易让它做你想做的事情:只需使用想要用于参数的类型的表达式。例如:

C target = new C(); 
DoStuff((I1) target); 

C target = new C(); 
I1 i1 = target; 
DoStuff(i1); 

基本上没有任何额外的工作,在重载步骤会发现在候选集两种方法,并确定也不是比其他“更好” ,所以重载分辨率将失败。