Почему это?Требуется ли указатель при вызове метода интерфейса расширения внутри класса, который реализует интерфейс? - PullRequest
3 голосов
/ 04 ноября 2011

Данный интерфейс

public interface IHaveError
{
    string ErrorMessage { get; set; }
}

Расширение

public static class HaveErrorExtensions
{
    public static void SetErrorMessage(this IHaveError target, string message)
    {
        target.ErrorMessage = message;
    }
}

Класс

public class HaveError : IHaveError
{
    public string ErrorMessage { get; set; }

    public void DoSomething()
    {
        this.SetErrorMessage(message);
    }
}

Почему при вызове метода расширения требуется this.?Имя не разрешается без него.

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Так работают методы расширения в спецификации языка C #.Если вы читаете раздел «7.6.5.2 Вызовы методов расширения», то в основном говорится, что вы должны вызывать метод одной из следующих форм:

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

Если вы заметили, expr равно требуется для поиска метода расширения в качестве опции.

В этом случае this. становится expr. выше, так что вышеупомянутое может быть преобразовано в вызов статического метода для типа, где это метод расширения, определенный как:

C . indentifier ( expr , args )

В вашем случае, чтобы компилятор "нашел" (или даже нашел) вызов метода, вам нужно указать некоторый тип "expr".Явное this. квалифицируется.Это заставляет компилятор принять следующее:

this.SetErrorMessage(message);

И найти подходящий метод расширения, который работает с типом, переведя его в:

HaveErrorExtensions.SetErrorMessage(this, message);
4 голосов
/ 04 ноября 2011

Методы расширения - это просто статические методы с некоторым синтаксическим сахаром (очень вкусный синтаксический сахар!), Применяемым компилятором.Ссылка на объект, который метод вызывается 'on', фактически является первым аргументом метода.

Компилятору необходимо знать, какой экземпляр вы имеете в виду.Не могу догадаться.

3 голосов
/ 04 ноября 2011

Потому что this относится к текущему объекту, с которым вы работаете. Без this компилятор не знает, к чему применить метод расширения.

...