假设我有一个继承自2个接口(C
和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)
如果I2
来自I1
,我认为它相对简单 - 调用I2
版本。我对接口是独立的情况感兴趣。
假设我无法修改C
,I1
或I2
。而.NET 2.0如果有任何区别的话。
答案 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)