Nig*_*ins 3 c# interface disambiguation
假设我有一个C继承自2个接口(I1和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)
Run Code Online (Sandbox Code Playgroud)
如果I2派生自I1,我认为它相对简单 - I2版本被调用.我对接口是独立的情况感兴趣.
假设我无法编辑C,I1或I2.和.NET 2.0如果有任何区别.
Bol*_*ock 13
没有人被召唤.如果您的两个方法在同一个类中是重载,则编译器根本不会尝试消除歧义.它只是不编译你的代码,说你的两个重载之间是不明确的,因为你声明target是一个实现两个接口的类型.
如果您声明target属于某种接口类型,或者在调用时将其强制转换(如Jon所示),那么就没有歧义.
正如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)
基本上不需要任何额外的工作,重载解析步骤将在候选集中找到这两个方法,并确定这两个方法都不比另一个更好,因此重载解析将失败。