4

次の例では、コンパイラがaがaであることを認識しているcollectionAのに、なぜキャストできないのですか?collectionBTItemA<T>

public class A<T>
{
}

public void Foo<TItem, T> () where TItem : A<T>
{
    var collectionA = new List<TItem>();
    var collectionB = (List<A<T>>)collectionA; // "Cannot cast" error here
}
4

3 に答える 3

1

問題は、不適切なアイテムをcollectionAに配置できるようになることです。

これは、問題を簡単に確認できるようにするための簡略化された手直しです。

あなたが(擬似コード)を持っていると仮定します:

class Animal {...}

class Dog: Animal { Bark(){} }

class Cat: Animal { Meow(){} }

今、あなたがこれを行うことができると想像してください:

var dogs = new List<Dog>();

dogs.Add(new Dog());

dogs[0].Bark();

var animals = (List<Animal>) dogs;

次に、これを行うことができます:

animals.Add(new Animal()); // Adds an Animal to the list 'dogs', which 'animals' references.

dogs[1].Bark(); // dogs will now have two elements, but the second isn't a dog -
                // so calling Bark() will explode.
于 2012-11-12T23:30:49.387 に答える
0

これは、リスト内の各アイテムをからにキャストするのではなく、からに変換するようにシステムに指示しているためだとList<X>思います。List<Y>XY

ただし、これは可能です。

public class A<T>
{
}

public void Foo<TItem, T>() where TItem : A<T>
{
    var collectionA = new List<TItem>();
    var collectionB = new List<A<T>>(collectionA.ToArray()); 
}
于 2012-11-12T23:20:59.007 に答える
0

どちらかを使いたい

var collectionB = collectionA.OfType<List<A<T>>>(); 

また

var collectionB = collectionA.Cast<List<A<T>>>();

List<A<T>>最初のものは、タイプではなく、それとして扱うことができないものをすべて無視します。リストに変換できないものがある場合、2番目は例外をスローします。

于 2012-11-12T23:34:38.623 に答える