Код немного странный, так что несите меня (имейте в виду, что этот сценарий появился в производственном коде).
Скажем, у меня есть эта структура интерфейса:
public interface IBase { }
public interface IChild : IBase { }
public interface IFoo<out T> where T : IBase { }
С помощью этого метода расширения класса, построенного вокруг интерфейсов:
public static class FooExt
{
public static void DoSomething<TFoo>(this TFoo foo)
where TFoo : IFoo<IChild>
{
IFoo<IChild> bar = foo;
//foo.DoSomethingElse(); // Doesn't compile -- why not?
bar.DoSomethingElse(); // OK
DoSomethingElse(foo); // Also OK!
}
public static void DoSomethingElse(this IFoo<IBase> foo)
{
}
}
Почему не компилируется строка с комментариями в DoSomething
? Компилятор с удовольствием позволяет мне назначать foo
to bar
, который имеет тот же тип, что и общее ограничение, и вместо этого вызывает метод расширения. Также не нужно вызывать метод расширения без синтаксиса метода расширения.
Может ли кто-нибудь подтвердить, является ли это ошибкой или ожидаемым поведением?
Спасибо!
Просто для справки, здесь ошибка компиляции (типы сокращены для удобочитаемости):
"TFoo" не содержит определения для "DoSomethingElse", а лучший метод перегрузки над расширением "DoSomethingElse (IFoo)" содержит некоторые недопустимые аргументы