С# Превышение метода расширения
Я немного смущен тем, как работают методы расширения.
Если я правильно это прочитаю 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();
}
}
Оцените любую помощь в разъяснении поведения.
Ответы
Ответ 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
; он просто смотрит на тип, объявленный переменной.