Если метод расширения имеет ту же сигнатуру, что и метод в запечатанном классе, каков приоритет вызова? - PullRequest
14 голосов
/ 21 февраля 2010

Я читал о методах расширения в C # 3.0. Текст, который я читаю, подразумевает, что метод расширения с той же сигнатурой, что и у метода в расширяемом классе, будет вторым по порядку выполнения, то есть метод в запечатанном классе вызывается. Если это так, как вы можете продлить запечатанный класс?

Ответы [ 2 ]

13 голосов
/ 21 февраля 2010

Действительно, фактический метод имеет приоритет над методом расширения. И просто чтобы прояснить - «порядок исполнения» предполагает, что оба могут быть вызваны; только будет вызван оригинальный метод. Возможно, выберите другое имя / подпись; Вы не можете использовать методы расширения для monkey-patch, если это ваше намерение.

Если есть некоторый базовый класс / интерфейс (который реализует тип), который не не имеет этого метода, вы могли бы привести его туда ...?

6 голосов
/ 21 февраля 2010

Использовать другой метод подписи. Методы расширения подразумевают, что вы расширяете запечатанный класс новыми функциями, а не переопределяете уже реализованные.

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

Для более подробной информации, посмотрите на этот пост: Рекомендации по методам расширения (Методы расширения, часть 6)

...