2 回答
TA贡献1860条经验 获得超8个赞
您需要进行修改,UtilityClass以便该方法也向下传递泛型类型:
internal void Method<T>(GenericClass<T> genericClass) where T: BaseType
{
}
TA贡献1871条经验 获得超13个赞
这个问题每天都会被问到。再一次!
class Cage<T> where T : Animal
{
public void Add(T t) { ... }
}
现在你的问题是:为什么这是非法的?
Cage<Animal> cage = new Cage<Gerbil>();
因为这一行是合法的:
cage.Add(new Tiger());
Cage<Animal>有一个方法Add,它需要Animal. ATiger是 anAnimal所以必须是合法的。但这意味着我们只是将老虎放入沙鼠笼中。
由于该行必须是合法的并且会导致类型错误,因此其他一些行必须是非法的,现在您知道它是哪一行了。
你想要的特性称为泛型协方差,它在 C# 中是合法的,当:
泛型类型是接口或委托
可变类型参数是引用类型
接口或委托已被标记为安全的变化。
例如:
IEnumerable<Animal> animals = new List<Tiger>() { new Tiger() };
那是合法的。List<Tiger>implements IEnumerable<Tiger>,它是一个接口并标记为协方差安全,因此可以将其分配给IEnumerable<Animal>。
您会注意到无法将鸭子放入动物序列中,因此无法将鸭子放入老虎序列中。这就是我们如何知道协方差是安全的。
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报