4

假设我有一个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)

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

假设我无法编辑C,I1I2. 如果这有什么不同的话,还有 .NET 2.0。

4

3 回答 3

15

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

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

于 2011-09-08T10:31:47.580 回答
6

正如 BoltClock 所说,它不会编译。但是,很容易让它做你想做的事:只需使用你想要用于参数的类型的表达式。例如:

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

或者

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

Basically without any extra work, the overload resolution steps will find both methods in the candidate set, and determine that neither is "better" than the other, so overload resolution will fail.

于 2011-09-08T10:34:40.337 回答
3

There will be an error when you try to compile it:

error CS0121: The call is ambiguous between the following methods or properties: 'DoStuff(I1)' and 'DoStuff(I2)'"

于 2011-09-08T10:35:51.507 回答