Подтвердить что ты не робот

С# Превышение метода расширения

Я немного смущен тем, как работают методы расширения.

Если я правильно это прочитаю http://msdn.microsoft.com/en-us/library/bb383977.aspx и Если метод расширения имеет та же подпись, что и метод в закрытом классе, каков приоритет вызова?.

Затем следующее должно выписать "Экземпляр", но вместо этого он пишет "Метод расширения".

interface IFoo
{
}

class Foo : IFoo
{
    public void Say()
    {
        Console.WriteLine("Instance");
    }
}

static class FooExts
{
    public static void Say(this IFoo foo)
    {
        Console.WriteLine("Extension method");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IFoo foo = new Foo();
        foo.Say();
    }
}

Оцените любую помощь в разъяснении поведения.

4b9b3361

Ответ 1

Большая разница здесь в том, что вы определили метод расширения для интерфейса IFoo, а ваша переменная foo имеет тип IFoo.

Если ваш код должен выглядеть следующим образом:

Foo foo = new Foo();
foo.Say()

Будет выполнен метод Foo.Say(), а не метод расширения.

Я хотел бы дать вам подробное объяснение, почему это так, но я могу только осветить основной механизм. Поскольку ваша переменная имела тип IFoo, а не foo, когда компилятор пытался определить, какие методы были доступны, он просматривал любые неинтерфейсные методы класса foo (как и должно быть). Однако метод расширения Say() был доступен, поэтому он вызывал это.

Ответ 2

В Main foo объявляется как IFoo. Когда компилятор ищет метод Say, он находит только метод расширения. Это происходит потому, что метод экземпляра объявлен в foo, а не в IFoo. Компилятор не знает, что переменная foo содержит экземпляр foo; он просто смотрит на тип, объявленный переменной.