Generic Class Covariance

后端 未结 3 718
独厮守ぢ
独厮守ぢ 2020-12-11 06:09

Is it possible to make the following code compile in C#? I do compile similar in Java.

public interface IInterface
{
    ...
}

public class Class1 : IInterf         


        
相关标签:
3条回答
  • 2020-12-11 06:32

    you cannot use generic like this.list type is IInterface but you try to add Class1 type into the list.it should be as follows..

            List<Base<Class1>> list = new List<Base<Class1>>();
            Class2<Class1> item = new Class2<Class1>();
            list.Add(item); 
    
    0 讨论(0)
  • 2020-12-11 06:47

    No, that is not legal in C#. C# 4 and above support covariance and contravariance of generic interfaces and generic delegates when they are constructed with reference types. So for example, IEnumerable<T> is covariant, so you could say:

    List<Giraffe> giraffes = new List<Giraffe>() { ... };
    IEnumerable<Animal> animals = giraffes;
    

    but not

    List<Animal> animals = giraffes;
    

    Because a list of animals can have a tiger inserted into it, but a list of giraffes cannot.

    Do a web search on covariance and contravariance in C# and you'll find lots of articles on it.

    0 讨论(0)
  • 2020-12-11 06:51

    Looks like .NET Framework 4.0 supports covariance in generic interfaces and delegates. So, I happened to compile the code by adding a generic interface.

    public interface IInterface
    {
        ...
    }
    
    public class Class1 : IInterface
    {
        ...
    }
    
    public interface IBase<out T> where T: IInterface
    {
        // Need to add out keyword for covariance.
    }
    
    public class Base<T> : IBase<T> where T : IInterface
    {
        ...
    }
    
    public class Class2<T> : Base<T> where T : IInterface
    {
        ...
    }
    
    .
    .
    .
    
    public SomeMethod()
    {
        List<IBase<IInterface>> list = new List<IBase<IInterface>>();
        Class2<Class1> item = new Class2<Class1>();
        list.Add(item); // No compile time error here.
    }
    
    0 讨论(0)
提交回复
热议问题