具有通用元素和约束的通用接口

时间:2013-09-06 13:31:34

标签: c# c#-4.0 generics

我想定义一个包含通用元素的通用库:

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未定义。

我找不到合适的syntax。我怎么能表达这样的约束呢?

3 个答案:

答案 0 :(得分:4)

我相信你只是想做到这一点:

where T : ILibElement<T, IVersion<T>>

因为ILibElement表示为ILibElement<T, IVersion<T>>,您只需要专门实现与您正在实施的T的接口。

答案 1 :(得分:1)

我认为你可以尝试这样的逻辑

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>
{

}

希望这个帮助

答案 2 :(得分:1)

必须将通用类型参数指定为标识符;约束可能使用更复杂的嵌套公式,但参数本身不能。如果想要一个采用某种类型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的通用参数可以提供这样的目的