由于一般类型的限制属于定义类别(U
,请参看您的事例)的类型参数,因此从《公约》的角度来看,与接口的类型参数不同。
The type parameter of the class need not be the actual type parameter of the interface. It need not even be a simple type, as in:
class Implementation<T> : IGenericType<List<T>> { /* ... */ }
In this case, the compiler recognizes that List<T>
satisfies the constraint, and so no further specification is necessary. But without such knowledge about the generic type parameter, the compiler requires you to declare it explicitly.
将这种做法与通用方法的类似但并非相同的行为相比较是有启发性的。 如同实施接口的班级一样,在申报中必须具体说明这类限制。 有一个明显的例外:如果执行明确的话。 事实上,如果你试图重新实施这些限制,汇编者将产生错误。
例如,考虑到接口
interface ISomething {
void DoIt<T>() where T : new();
}
执行这一接口的两种正确方式是:
class OneThing : ISomething {
public void DoIt<T>() where T : new() { }
}
class OtherThing : ISomething {
void ISomething.DoIt<T>() { }
}
排除<代码>第1版代码>中的限制,或在<代码>中填报。 其他Thing产生汇编时错误。 为什么在第一次执行中,而不是在第二次执行中,我们需要限制? d 出于上文提及的对接口的类型限制的同样原因:在第一次实施过程中,<代码>T<>/code>与接口方法的类型参数没有关系,因此,必须明确对应接口方法的方法。 在第二次实施过程中,我们明确宣布接口,这意味着“参数”<代码>与接口中使用的参数完全相同。