Как C # устраняет неоднозначность между несколькими интерфейсами в вызовах методов? - PullRequest
2 голосов
/ 08 сентября 2011

Предположим, у меня есть класс C, который наследуется от 2 интерфейсов (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, если это что-то меняет.

Ответы [ 3 ]

12 голосов
/ 08 сентября 2011

Ни один не вызывается.Если ваши два метода перегружены в одном и том же классе, компилятор вообще не пытается устранить неоднозначность.Он просто не скомпилирует ваш код, говоря, что между вашими двумя перегрузками он неоднозначный, поскольку вы объявили target типом, который реализует оба интерфейса.быть одним из типов интерфейса или приводить его во время вызова (как показывает Джон), тогда двусмысленности нет.

4 голосов
/ 08 сентября 2011

Как говорит BoltClock, он не скомпилируется.Тем не менее, легко заставить его делать то, что вы хотите: просто используйте выражение типа, которое вы хотите использовать для аргумента.Например:

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

или

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

В основном без какой-либо дополнительной работы, шаги с разрешением перегрузки найдут оба метода в наборе кандидатов и определяютни один из них не «лучше», чем другой, поэтому разрешение перегрузки не удастся.

2 голосов
/ 08 сентября 2011
...