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

声明AnimalBag<Animal> bag指出,bag 将能够存储任何类型的Animal。该作业= new AnimalBag<Cat>();与此相矛盾,说它实际上只能存储Cats。它是哪一个,因为它不能两者兼而有之?

于 2013-03-13T16:27:37.530 回答
1

这种情况是 co-variant 发挥作用的地方,但 co-variant 不适用于class,仅适用于interfacedelegate,因此您需要使用关键字定义interfaceco-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>();

您可以在泛型中检查更多协方差和逆变

于 2013-03-13T16:28:57.717 回答