繁体   English   中英

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

[英]How does C# disambiguate between multiple interfaces in method calls?

假设我有一个继承自2个接口( I1I2 )的C类。 我还有两个版本的方法( 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版本。 我对接口是独立的情况感兴趣。

假设我无法编辑CI1I2 和.NET 2.0如果有任何区别。

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

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

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

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

要么

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM