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 に答える