给出以下代码:
class A<T>
{
internal void Add(T obj) { }
}
class C { }
class B<T> where T : C
{
public B()
{
A<T> a = new A<T>();
a.Add(new C());
}
}
对Add
的调用无法编译。当我首先将它投射到T
时,它会这样做:
a.Add((T)new C());
这可能是睡眠剥夺,但我在这里失踪了什么?
如果T
类型为C
(请注意B
上的约束),那么为什么A<T>
不等同于A<C>
?
答案 0 :(得分:4)
因为如果B被声明为D类型,这将是一个扩展C的类,那么添加新的C将违反该类型。
答案 1 :(得分:3)
因为T可能是C的子类。
你不能将动物bob = new Fish()添加到List&lt; Giraffe&gt;
答案 2 :(得分:2)
A.Add()
期待T
。你给它一个C
。只要编译器知道C
是T
,这是可以的。
但这不是你的约束所说的。它只表示T
是C
,这是相反的。