0
public class Animal
{

}
public class Cat : Animal
{

}

public class AnimalBag<T> where T : Animal
{

} 

...
AnimalBag<Animal> bag = new AnimalBag<Cat>();

このエラーが発生します:

タイプを暗黙的AnimalBag<Cat>に`AnimalBag'に変換することはできません

そして私がこれを試してみると:

AnimalBag<Animal> bag = (AnimalBag<Animal>) new AnimalBag<Cat>();

AnimalBag<Cat>タイプをに変換できませんAnimalBag<Animal>

C#でこの種の問題を解決するにはどうすればよいですか?これはJavaで完全に機能します。

4

2 に答える 2

1

この場合は co-variant の出番ですが、 co-variant はclassでは機能せず、 interfacedelegateのみで機能するため、キーワードinterfaceを使用して co-variant を定義する必要があります。out

public interface IAnimalBag<out T> where T : Animal
{
}

public class AnimalBag<T> : IAnimalBag<T> where T: Animal
{
}

次に、次を割り当てることができます。

IAnimalBag<Animal> bag = new AnimalBag<Cat>();

Generics でより多くの共分散と反分散を確認できます

于 2013-03-13T16:28:57.717 に答える
1

宣言には、バッグはあらゆる種類のAnimalAnimalBag<Animal> bagを収納できると記載されています。この割り当ては、実際にはCatsしか格納できないと言って、これと矛盾しています。両方はあり得ないのでどちらですか?= new AnimalBag<Cat>();

于 2013-03-13T16:27:37.530 に答える