Методы расширения на самом деле не являются частью объекта, на который вы хотите вызвать метод. Методы расширения находятся в дополнительной области поиска, которую компилятор просматривает после поиска метода в области самого объекта.
Итак, для вызова метода, такого как obj.MyExtension()
, компилятор будет искать «MyExtension» в членах типа переменной obj. Он не найдет совпадений, потому что «MyExtension» не определен в типе объекта. Затем компилятор ищет методы расширения с именем «MyExtension», которые доступны в текущей области (из-за использования предложений), которые имеют параметр this
, тип которого соответствует типу переменной экземпляра obj. Если совпадение найдено, то компилятор генерирует код, чтобы заставить статический метод вызывать этот другой метод, передавая obj в параметре this
.
Я считаю, что область методов расширения - это «последний шанс» поиска - если компилятор не может найти «MyExtension» в доступных расширениях, следующим шагом будет сбой при ошибке компиляции.
Сложная вещь с методами расширения - они доступны только в том случае, если вы добавили соответствующее предложение использования в текущий исходный файл. и добавили ссылку на соответствующую сборку, которая реализует расширения для приведения их в область видимости.
Intellisense не поможет вам разрешить эти имена, добавив для вас соответствующее предложение use. Как пользователь вы привыкаете вызывать конкретный метод для определенного типа объекта, и вы мысленно ассоциируете этот метод как часть этого типа. Когда вы создаете новый исходный файл, очень часто приходится записывать вызовы этого метода, как обычно, и получать «не найденные» ошибки компилятора, потому что вы забыли ссылаться на пространство имен/сборку, содержащую определение (-ы) расширений исходный файл.
Это функция языка C#? Какие еще языки поддерживают это? – Mohanavel 2010-12-02 18:46:29