泛型类型参数必须指定为标识符;约束可以使用更复杂的嵌套公式,但参数本身不能。如果想要一个带有某种类型参数的泛型方法,Nullable<T>
则不会将其指定为:
void ThisWontWork<Nullable<T>>(T it) where T:struct {...}
但改为:
void ThisWillWork<T>(Nullable<T> it) where T:struct {...}
如果您的集合可能包含进一步限定的通用事物,它们都是一种类型,您可能希望将该类型添加为您的集合的类型参数:
class ListOfLists<T,U> where T:IList<U>
如果您的集合将包含实现具有各种泛型类型的泛型接口的东西,但您只需要使用不涉及此类类型的成员,那么您应该尽可能拥有不关心的成员泛型类型被隔离到它们自己的接口中,可以被完整的泛型继承。例如,虽然微软没有以IDictionary
这种方式设计它们,但它可以被定义为(部分:)
interface ICheckIfContained
{ bool Contains(object it); }
interface ICheckIfContained<in T> : ICheckIfContained
{ bool Contains(T it); }
interface IDictionary<in TKey, out TValue> : ICheckIfContained<TKey> ...
如果一个人想要保存对字典的引用的集合,纯粹是为了扫描其中的键键,而不考虑这些键将映射到什么,那么约束到的通用参数ICheckIfContained
可以服务于这样的目的。