質問

どのようにして、次のコードを動作させることができますか?私は、私はかなり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で可能になります。

これは、以下を使用し、4.0まではただの回避策である、C#3.0で動作させるには:

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

        // Compiler is happy
        List<A> listC = GetCList().OfType<A>().ToList();
役に立ちましたか?

解決

あなたはいつもこれを行うことができます。

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

"ボヤンRESNIK" は指摘したように、あなたも...行うことができます。

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

注意すべき違いは、型の1つ以上が一致しない場合キャスト()が失敗することです。ここでOfType ()変換可能なオブジェクトのみを含むのIEnumerable を返します。

他のヒント

安全であると判断することができないので、

これが動作しない理由があります。あなたが持っているとしよう。

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());  

そしてちょっと、あなただけのキリンのリストにカメを入れ、型システムの整合性は現在違反しています。これは違法である理由です。

ここで重要なのは、「動物」と「キリン」は同じオブジェクトを参照することで、そのオブジェクトは、キリンのリストです。しかし、キリンのリストは、動物のリストを行うことができますできるだけ多くを行うことはできません。特に、それは亀を含めることはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top