Następne pytanie do a previous question, zostało to zidentyfikowane jako problem związany z koinwersją. Biorąc to jeden stopień dalej, jeśli zmodyfikować IFactory
następująco:Dlaczego lista <T> jest nieważna na interfejsie kowariancyjnym MyInterface <out T>
class Program
{
static void Main(string[] args)
{
IFactory<IProduct> factory = new Factory();
}
}
class Factory : IFactory<Product>
{
}
class Product : IProduct
{
}
interface IFactory<out T> where T : IProduct
{
List<T> MakeStuff();
}
interface IProduct
{
}
uzyskać:
Nieprawidłowy wariancji: Rodzaj parametr T musi być niezmienniczo ważne w Sandbox.IFactory.MakeStuff(). T jest kowariantny.
Dlaczego to nie jest prawidłowe? Jak można/należy to rozwiązać?
Należy zauważyć, że po napisaniu tej odpowiedzi została wydana nowa wersja .NET Framework, w której 'List' implementuje nowy interfejs 'IReadOnlyList '. Jak wskazano, interfejs jest kowariantny, podobnie jak "IEnumerable ". –