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

Nig*_*ins 3 c# interface disambiguation

假设我有一个C继承自2个接口(I1I2)的类.我还有一个方法(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)
Run Code Online (Sandbox Code Playgroud)

如果I2派生自I1,我认为它相对简单 - I2版本被调用.我对接口是独立的情况感兴趣.

假设我无法编辑C,I1I2.和.NET 2.0如果有任何区别.

Bol*_*ock 13

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

如果您声明target属于某种接口类型,或者在调用时将其强制转换(如Jon所示),那么就没有歧义.


Jon*_*eet 5

正如BoltClock所说,它不会编译。但是,让它轻松执行所需的操作:只需使用用于参数的类型的表达式即可。例如:

C target = new C();
DoStuff((I1) target);
Run Code Online (Sandbox Code Playgroud)

要么

C target = new C();
I1 i1 = target;
DoStuff(i1);
Run Code Online (Sandbox Code Playgroud)

基本上不需要任何额外的工作,重载解析步骤将在候选集中找到这两个方法,并确定这两个方法都不比另一个更好,因此重载解析将失败。