作为基类型c#2.0的集合的集合

作为基类型c#2.0的集合的集合,c#,collections,C#,Collections,我知道 在.NET2.0中,在没有.Cast的情况下,我如何做到这一点 它必须是引用相等的,即列表的副本不起作用 要重新迭代-我无法返回新列表-它必须与您想要的列表相同: List<T>.ConvertAll() List.ConvertAll() 了解更多信息。您不知道 在C#2和C#3中,不可能有引用相等和改变元素类型 在C#4中,可以使用引用等式并改变元素类型;这种转换称为“协变”转换。协变转换仅在IEnumerable上合法,在IList或列表上不合法。只有当源和目标T类

我知道

在.NET2.0中,在没有.Cast的情况下,我如何做到这一点

它必须是引用相等的,即列表的副本不起作用

要重新迭代-我无法返回新列表-它必须与您想要的列表相同:

List<T>.ConvertAll()
List.ConvertAll()
了解更多信息。

您不知道

在C#2和C#3中,不可能有引用相等和改变元素类型

在C#4中,可以使用引用等式并改变元素类型;这种转换称为“协变”转换。协变转换仅在
IEnumerable
上合法,在
IList
列表上不合法。只有当源和目标T类型为引用类型时,协变转换才合法。简言之:

List<Mammal> myMammals = whatever;
List<Animal> x0 = myMammals; // never legal
IEnumerable<Mammal> x1 = myMammals; // legal in C# 2, 3, 4
IEnumerable<Animal> x2 = myMammals; // legal in C# 4, not in C# 2 or 3
IEnumerable<Giraffe> x3 = myMammals; // never legal
IList<Mammal> x4 = myMammals; // legal in C# 2, 3, 4
IList<Animal> x5 = myMammals; // never legal
IList<Giraffe> x6 = myMammals; // never legal
List<int> myInts = whatever;
IEnumerable<int> x7 = myInts; // legal
IEnumerable<object> x8 = myInts; // never legal; int is not a reference type
列出我的哺乳动物=无论什么;
列表x0=myo;//不合法
IEnumerable x1=MyMalimates;//C#2、3、4中的法律
IEnumerable x2=我的哺乳动物;//在C#4中是合法的,而不是在C#2或C#3中
IEnumerable x3=我的哺乳动物;//不合法
IList x4=我的哺乳动物;//C#2、3、4中的法律
IList x5=我的哺乳动物;//不合法
IList x6=我的哺乳动物;//不合法
列出myInts=which;
IEnumerable x7=myInts;//合法的
IEnumerable x8=myInts;//从不合法;int不是引用类型

埃里克是对的。他的回答应该是公认的。不过,我还要补充一个建议。如果它是您的集合(例如,您可以修改集合类),那么您可以实现IEnumerable(WhateverBase的),即使您的集合是从集合(Whatever的)派生的

事实上,您也可以实现IList(WhateverBase的)、ICollection(WhateverBase的)等,例如,如果您在Add方法中得到不兼容的类型,则会抛出运行时异常

class GiraffeCollection : Collection<Giraffe>, IEnumerable<Animal> {

    IEnumerator<Animal> IEnumerable<Animal>.GetEnumerator() {
        foreach (Giraffe item in this) {
            yield return item;
        }
    }

}
类长颈鹿集合:集合,IEnumerable{
IEnumerator IEnumerable.GetEnumerator(){
foreach(本章长颈鹿项目){
收益回报项目;
}
}
}

这不符合列表具有引用相等性的规定要求。强制转换运算符无论如何也不满足您的要求。事实上,我们经常看到这种模式被用来规避接口协方差的缺乏。幸运的是,一旦我们在语言和基类库中有了真正的接口协方差,它就会开始消失。