[英]How does C# disambiguate between multiple interfaces in method calls?
假设我有一个继承自2个接口( I1
和I2
)的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
版本。 我对接口是独立的情况感兴趣。
假设我无法编辑C
, I1
或I2
。 和.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.