虽然我已经看过这些例子,但我仍然很困惑如何让它工作。我需要支持泛型中的一些差异。
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();
}
}
这里的错误是什么。
答案 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();