使用c#中的模板进行分配

时间:2013-03-13 16:22:00

标签: c# templates generics covariance

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中非常有效。

2 个答案:

答案 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