如何在这里支持Co Variance泛型

时间:2013-06-07 09:11:54

标签: c# c#-4.0

虽然我已经看过这些例子,但我仍然很困惑如何让它工作。我需要支持泛型中的一些差异。

public interface I1 { }

public class BaseClass<U> : List<U>
    where U : I1 {}

public class Class1 : I1 { }

public class DerivedClass : BaseClass<Class1>
{
}

public class TestMain
{
    public void StartUsing()
    {
        /*Compiler error,              
         Cannot implicitly convert type 'DerivedClass' to 'BaseClass<I1>'*/
        BaseClass<I1> baseObj = new DerivedClass();
    }
}

这里的错误是什么。

1 个答案:

答案 0 :(得分:1)

首先,List<U>是不变的,如果继承自BaseClass,则无法使List<U>协变。

其次,co-variant仅支持接口,因此您必须将BaseClass更改为接口而不是类。

第三,使用out关键字将接口设为协变。因此,在您的情况下,您可以声明:

public interface I1 { }

public interface IBaseClass<out U> : IEnumerable<U> where U : I1 { }

public class Class1 : I1 { }

public class DerivedClass : IBaseClass<Class1>
{
}

然后,它有效:

IBaseClass<I1> baseObj = new DerivedClass();