1

如何使以下代码工作?我认为我不太了解 C# 泛型。也许,有人可以指出我正确的方向。

    public abstract class A
    {
    }

    public class B : A
    {
    }

    public class C : A
    {
    }

    public static List<C> GetCList()
    {
        return new List<C>();
    }

    static void Main(string[] args)
    {
        List<A> listA = new List<A>();

        listA.Add(new B());
        listA.Add(new C());

        // Compiler cannot implicitly convert
        List<A> listB = new List<B>();

        // Compiler cannot implicitly convert
        List<A> listC = GetCList();

        // However, copying each element is fine
        // It has something to do with generics (I think)
        List<B> listD = new List<B>();
        foreach (B b in listD)
        {
            listB.Add(b);
        }
    }

这可能是一个简单的答案。

更新:首先,这在 C# 3.0 中是不可能的,但在 C# 4.0 中是可能的。

要让它在 C# 3.0 中运行,这只是 4.0 之前的一种解决方法,请使用以下命令:

        // Compiler is happy
        List<A> listB = new List<B>().OfType<A>().ToList();

        // Compiler is happy
        List<A> listC = GetCList().OfType<A>().ToList();
4

2 回答 2

5

这不起作用的原因是因为无法确定它是安全的。假设你有

List<Giraffe> giraffes = new List<Giraffe>();
List<Animal> animals = giraffes; // suppose this were legal.
// animals is now a reference to a list of giraffes, 
// but the type system doesn't know that.
// You can put a turtle into a list of animals...
animals.Add(new Turtle());  

嘿,你只是把一只乌龟放到了长颈鹿的列表中,现在类型系统的完整性已经被破坏了。这就是为什么这是非法的。

这里的关键是“动物”和“长颈鹿”指的是同一个对象,而那个对象是一个长颈鹿列表。但是一份长颈鹿的名单不能像一份动物的名单那样多。特别是,它不能包含乌龟。

于 2009-05-20T05:57:14.863 回答
3

你总是可以这样做

List<A> testme = new List<B>().OfType<A>().ToList();

正如“Bojan Resnik”所指出的,你也可以这样做......

List<A> testme = new List<B>().Cast<A>().ToList();

需要注意的一个区别是,如果一个或多个类型不匹配, Cast<T>() 将失败。其中 OfType<T>() 将返回一个 IEnumerable<T> 仅包含可转换的对象

于 2009-05-20T02:40:43.087 回答