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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Подробнее см. в этом сообщении: Рекомендации по методам расширенных методов (методы расширения, часть 6)