2

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

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

我找不到正确的语法。我怎么能表达这样的约束?

4

3 回答 3

4

我相信你只是想这样做:

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

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

于 2013-09-06T13:33:28.503 回答
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>
{

}

希望这有帮助

于 2013-09-07T12:28:57.610 回答
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可以服务于这样的目的。

于 2013-09-07T19:55:56.250 回答