Большая разница в том, что вы определили метод расширения для интерфейса IFoo
, а ваша переменная foo
имеет тип IFoo
.
Если ваш код должен был выглядеть так:
Foo foo = new Foo();
foo.Say()
Будет выполнен метод Foo.Say (), а не метод расширения.
Хотел бы я дать вам подробное объяснение, почему это так, но я могу охватить только основной механизм. Поскольку ваша переменная имела тип IFoo
, а не Foo
, когда компилятор попытался определить, какие методы были доступны, он смотрел мимо любых неинтерфейсных методов класса Foo
(как и должно быть). Однако был доступен метод расширения Say()
, поэтому он вызвал это.