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中非常有效。
答案 0 :(得分:1)
声明AnimalBag<Animal> bag
声明行李将能够存储任何类型的动物。赋值= new AnimalBag<Cat>();
与此相矛盾,因为它实际上只能存储 Cats 。这是什么,因为它不可能两者兼而有之?
答案 1 :(得分:1)
这种情况是共变体发挥作用的地方,但是共同变体不适用于类,只有接口和委托 ,因此您需要使用interface
关键字
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中查看更多co-variance and contra-variance