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

时间:2009-12-08 12:41:12

标签: c# collections

我知道Passing a generic collection of objects to a method that requires a collection of the base type

如何在.Net 2.0中我没有.Cast ???

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

要重新迭代 - 我无法返回列表 - 它必须是相同的列表

3 个答案:

答案 0 :(得分:8)

你没有。

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

在C#4中,您可以具有引用相等性并改变元素类型;这种转换称为“协变”转换。协变转换仅对IEnumerable<T>上的IList<T>,<{1}}或List<T>上的合法。只有当源类型和目标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

答案 1 :(得分:1)

埃里克是对的。他应该是公认的答案。我会补充一点建议。如果它是你的集合(就像你可以修改集合类一样),即使你的集合派生自Collection(Of Whatever),你也可以实现IEnumerable(Of WhateverBase)。

实际上,您可以实现IList(Of WhateverBase),ICollection(Of WhateverBase)等 - 如果您在Add方法中获得不兼容的类型,则抛出运行时异常。

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

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

}

答案 2 :(得分:0)

你想:

List<T>.ConvertAll()

See here了解更多信息。