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

时间:2011-09-08 10:29:17

标签: c# interface disambiguation

假设我有一个继承自2个接口(CI1)的类I2。我还有两个版本的方法(DoStuff),每个版本都将一个接口作为参数。如果我拨打DoStuff(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版本。我对接口是独立的情况感兴趣。

假设我无法修改CI1I2。而.NET 2.0如果有任何区别的话。

3 个答案:

答案 0 :(得分:12)

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

如果您将target声明为其中一种界面类型,或者在调用时将其强制转换(如Jon所示),那么就没有歧义。

答案 1 :(得分:4)

正如BoltClock所说,它不会编译。但是,很容易使它按照您的意愿执行:只需使用您想要类型的表达式用于参数。例如:

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

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

基本上没有任何额外的工作,重载决议步骤将在候选集中找到两种方法,并确定它们都不比另一种“更好”,因此重载解析将失败。

答案 2 :(得分:2)