@ RenéVogt рад помочь

тим, у нас есть интерфейс как

public interface IEnumerable<out T>
{ /*...*/ }

этосо-вариант вT.

Затем у нас есть другой интерфейс и класс, реализующий его:

public interface ISomeInterface {}
public class SomeClass : ISomeInterface
{}

Теперь ко-дисперсия позволяет нам сделать следующее

IEnumerable<ISomeInterface> e = Enumerable.Empty<SomeClass>();

Так чтоIEnumerable<SomeClass> присваивается к переменной (или параметру метода) типаIEnumerable<ISomeInterface>.

Но если мы попробуем это в общем методе:

public void GenericMethod<T>(IEnumerable<T> p) where T : ISomeInterface
{
    IEnumerable<ISomeInterface> e = p;
    // or
    TestMethod(p);
}
public void TestMethod(IEnumerable<ISomeInterface> x) {}

мы получаемошибка компилятора CS0266 говорит нам, чтоIEnumerable<T> не может быть преобразован вIEnumerable<ISomeInterface>.

Ограничение четко заявляетT происходит отISomeInterface, и с тех порIEnumerable<T> является ко-вариантом вTэто назначение должно работать (как показано выше).

Есть ли техническая причина, почему это не может работать в общем методе? Или что-то, что я пропустил, что делает компилятор слишком дорогим, чтобы понять это?

Ответы на вопрос(1)

Ваш ответ на вопрос