我想定义一个包含泛型元素的泛型库:
public interface ILibrary<T>
我的通用元素定义如下:
interface ILibElement<T, IVersion<T>>
我想添加约束,说明库中的元素必须实现 ILibElement。所以我想我可以像这样改变我对ILibrary的定义:
public interface ILibrary<T> where T : ILibElement<T, IVersion<T>>
但是我必须添加类型参数。所以我想做这样的事情:
public interface ILibrary<ILibElement<T, IVersion<T>>>
但 T 是未定义的。
我找不到正确的语法。我该如何表达这样的约束?
我相信你只是想这样做:
where T : ILibElement<T, IVersion<T>>
由于ILibElement
表示为 ILibElement<T, IVersion<T>>
因此您只需要使用要实现的T
专门实现该接口。
我想你可以尝试这样的逻辑
public interface ILibrary<T,V> where T:ILiBelement<T,V> where T:ILiBelement<T,V>
where V:IVersion<V>
{
}
interface ILiBelement<T,V> where V:IVersion<T>
{
}
interface IVersion<T>
{
}
希望这个帮助
泛型类型参数必须指定为标识符;约束可以使用更复杂的嵌套公式,但参数本身不得。 如果想要一个接受某种类型参数的泛型方法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>
如果你的集合将包含实现具有各种泛型类型的泛型接口的东西,但你只需要使用不涉及此类类型的成员,那么如果可能的话,你应该将不关心泛型类型的成员隔离到它们自己的接口中,该接口可以由完整的泛型继承。 例如,尽管Microsoft没有以这种方式设计他们的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
的通用参数可以达到这样的目的。