1

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

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();
    }
}

这里有什么错误。

4

1 回答 1

1

首先,List<U>是不变的,BaseClass如果继承自List<U>.

其次,协变只支持接口,所以你必须改为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();
于 2013-06-07T09:19:36.003 回答