具有泛型元素和约束的泛型接口



我想定义一个包含泛型元素的泛型库:

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的通用参数可以达到这样的目的。

最新更新