泛型:为什么不编译?

时间:2009-06-04 16:55:19

标签: c# generics constraints

给出以下代码:

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>

3 个答案:

答案 0 :(得分:4)

因为如果B被声明为D类型,这将是一个扩展C的类,那么添加新的C将违反该类型。

答案 1 :(得分:3)

因为T可能是C的子类。

你不能将动物bob = new Fish()添加到List&lt; Giraffe&gt;

答案 2 :(得分:2)

A.Add()期待T。你给它一个C。只要编译器知道CT,这是可以的。

但这不是你的约束所说的。它只表示TC,这是相反的。