Как устранить ошибки неоднозначности метода расширения в моей библиотеке расширений? - PullRequest
3 голосов
/ 11 марта 2020

Допустим, у меня есть метод расширения.

public static string DoSomething(this IInterfaceA @this) ...

и

public static string DoSomething(this IInterfaceB @this) ...

но если у меня есть класс, который реализует оба интерфейса, возможно ли это для библиотеки расширений, указать, какой из них следует предпочесть?

1 Ответ

5 голосов
/ 11 марта 2020

Краткий ответ - Нет, это невозможно.

Длинный ответ: Метод расширения - это всего лишь метод stati c, который принимает параметры и содержит ключевое слово this. Intellisense сканирует код, чтобы найти все методы расширения, и предоставляет нам сахар syntacti c, который позволяет вызывать их в экземпляре класса, аналогично обычным методам.

Интерфейс, с другой стороны, описывает поведение объекта и используется для группировки и разделения / разделения объектов по тому, что они делают:

IBird { void Fly(); }
IBug { void Crawl(); }

class Parrot : IBird {}
class Ant : IBug {}

Если у нас есть что-то вроде:

IGlidingBird { void Fly(); }  // and
IFlappingBird { void Fly(); }

Тогда, вероятно, у нас плохой дизайн, потому что интерфейс будучи контейнером виртуальных методов, вы ничего не должны знать о его фактической реализации.

В примере кода вы увидите ошибку времени компиляции: «Вызов неоднозначен между следующими методами ...» .

Хотя вы могли бы привести объект к одному из типов интерфейса, чтобы сообщить компилятору, какие методы использовать:

((IInterfaceA)instance).DoSomething()
((IInterfaceB)instance).DoSomething()

Это может быть хорошим моментом. сделать паузу и подумать, можно ли изменить дизайн и вообще избежать этой проблемы.

...