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

C# 如何在方法调用中消除多个接口之间的歧义?,c#,interface,disambiguation,C#,Interface,Disambiguation,假设我有一个类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 =

假设我有一个类
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,如果这有什么区别的话。

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


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

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

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


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

当您尝试编译它时,将出现错误:


一个非常有趣的问题-1在问这个问题之前,您显然没有测试过自己。关于运行时发生了什么的问题应该是关于实际编译的代码!(我不是说省略号!)我觉得奇怪的是,你决定发布一个问题,而不是仅仅测试它。我不确定这是否会编译?+1。我假设对DoStuff的调用是可以编辑的(否则它将无法编译),因此对I1或I2的转换将解决您的问题。
C target = new C();
I1 i1 = target;
DoStuff(i1);