C# 派生泛型

C# 派生泛型,c#,oop,C#,Oop,我的情况如下: public interface I {} public class D1 : I {} public class D2 : I {} public class A { public List<D1> Collection {get;set;} //Other Members } public class B { public List<D2> Collection {get;set;} //Other Members }

我的情况如下:

public interface I {}
public class D1 : I {}
public class D2 : I {}

public class A
{
    public List<D1> Collection {get;set;}
    //Other Members
}
public class B
{
    public List<D2> Collection {get;set;}
    //Other Members
}
公共接口I{}
公共类D1:I{}
公共类D2:I{}
公共A类
{
公共列表集合{get;set;}
//其他成员
}
公共B级
{
公共列表集合{get;set;}
//其他成员
}
因此,A和B都有一个列表,其中的元素来自于I

如何定义A和B的基类

另外,我试图概括基类:

class Base<T> where T : I
{
   List<T> Collection {get;set;}
}
A:Base<D1>{..}; B:Base<D2> {..}
类基,其中T:I
{
列表集合{get;set;}
}
A:碱基{..};B:基{..}
但它什么也没给我(或者我只是这么认为): 我不能这样做:

Base b;
b=新的A();
b=新的b()

因为不可能从
List
转换到
List


谢谢

如果你想一想,它确实有意义

考虑这一点:

Base<I> b = new B();
b.List.Add(new D1);

和列表之间的关系是什么?它是“是-是”列表关系还是“有-是”列表关系?B呢?从这些答案我们可以更清楚地继续。这是一个协方差/反方差问题。您可以在列表定义中使用
in
out
关键字来修复它。Thanx Stephane,您能稍微澄清一下您的答案吗?也许有一些关于协方差/逆方差的有用链接,因为我不是第一次面对这个问题,你应该阅读并花一些时间理解协方差和逆方差。你说这是不可能的,因为你不能从一个列表转换到另一个列表,这并不是全部。虽然这是不可能的,因为列表是不协变的,但是您可以完全从基类中删除列表,并且仍然可以看到编译器错误,因为基类本身是不协变的。这也不可能,因为C#不允许使用不变类;只能在接口和委托上定义协变/逆变。应为“C#只允许不变泛型类”。@PrestonGuillot-使用有效的示例更新。实际上在VS2012中检查了这个。
public interface IBase<out T> where T : I
{
    IEnumerable<T> Collection { get; }
}

public class A : IBase<D1>
{
    IEnumerable<D1> Collection { get; private set; }

    public A(IEnumerable<D1> list)
    {
        Collection = list;
    }
}

public class B : IBase<D2>
{
    IEnumerable<D2> Collection { get; private set; }

    public B(IEnumerable<D2> list)
    {
        Collection = list;
    }
}