将泛型类型的集合转换为C#中非泛型类型的集合

时间:2014-09-02 18:16:33

标签: c# generics casting

鉴于此类型:

public class DataRow
{

}
public class DataRow<T> : DataRow
{

}

使用它:

public class DataRowCollection
{
    public IList<DataRow> List{get;set;}
}
public class DataRowCollection<T> : DataRowCollection
{
    public new IList<DataRow<T>> List{get;set;}
}

为什么我无法将base.List分配给this.List中的DataRowCollection<T>?为什么我不能将this.List转换为非泛型类型并分配给base.List

修改DataRowCollection<T>

中失败的代码
base.List = (IList<DataRow>)this.List;

(演员表演失败)

base.List = this.List;

(编译器错误)

1 个答案:

答案 0 :(得分:3)

因为IList是不变的,而且与其泛型类型无协变或逆变。

如果该投射有效,那么您可以在列表中添加DataRow<SomeTypeThatIsNotT>,这将违反IList的合同。