シナリオ:
class A { }
class B : A { }
class C<T> where T: A { }
質問
C<A> = C<B>
BがAのサブクラスであるのに、なぜカントするのですか?「暗黙的に変換できません」エラーをスローします
ありがとう
--UPDATE--C<A>
それを認識
するための暗黙のメソッドを作成できますC<B>
か?
シナリオ:
class A { }
class B : A { }
class C<T> where T: A { }
質問
C<A> = C<B>
BがAのサブクラスであるのに、なぜカントするのですか?「暗黙的に変換できません」エラーをスローします
ありがとう
--UPDATE--C<A>
それを認識
するための暗黙のメソッドを作成できますC<B>
か?
Use co-variant if you need to do this, and because co-variant just work only with interface and delegate, so define an interface with the magic word out
instead of class:
interface IC<out T> where T : A
{
}
So, you can assign like you want:
class CA : IC<A>
{}
class CB : IC<B>
{ }
IC<A> x = new CA();
IC<B> y = new CB();
x = y;
あなたが求めているのは、ジェネリックスの共変性と反変性です。これは、インターフェースとデリゲートにのみ適用できます。これを確認できます
フレームワーク>=4で次のことができます:
interface IC<out T> where T : A
class C<T> : IC<T> where T : A
IC<A> ica = new C<B>();
あなたの場合、あなたはのためのインターフェースを抽出する必要がありますclass C
Why cant C<A> = C<B> when B is a subclass of A?
B
のサブクラスですがA
、C<B>
のサブクラスではありませんC<A>
。C<B>
との間には割り当ての互換性はありません C<A>
。
C<A>
ないのでC<B>
事はです; できれば
C<A> myA = new C<B>();
myA.Add(new A());
You'd have a problem, since B is A
, but not A is B