C#如何在方法调用中的多个接口之间消除歧义?
问题描述:
假设我有一个继承自2个接口(I1
和I2
)的类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)
如果I2
从I1
派生,我认为这是比较简单 - I2
版本被调用。我对接口是独立的情况感兴趣。
假设我不能编辑C
,I1
或I2
。和.NET 2.0,如果这有什么区别。
答
都不被调用。如果你的两个方法在同一个类中是重载的,那么编译器根本不会试图消除歧义。它不会编译你的代码,说你的两个过载之间是不明确的,因为你声明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);
基本上没有任何额外的工作,在重载步骤会发现在候选集两种方法,并确定也不是比其他“更好” ,所以重载分辨率将失败。
一个非常有趣的问题! – trampi
-1在问这个问题之前,你显然没有测试自己。 –
有关运行时会发生什么的问题需要关于实际编译的代码! (并且我不是在谈论椭圆!) – AakashM