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

sinceは、実装している でそのインターフェイスを具体的に実装する必要があるだけである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

ジェネリック型パラメーターは識別子として指定する必要があります。制約はより複雑な入れ子式を使用する場合がありますが、パラメーター自体は使用してはなりません。何らかの type のパラメーターを取る汎用メソッドが必要な場合は、次のNullable<T>ように指定しません。

void ThisWontWork<Nullable<T>>(T it) where T:struct {...}

しかし代わりに:

void ThisWillWork<T>(Nullable<T> it) where T:struct {...}

コレクションが、すべて 1 つの型である、さらに修飾された一般的なものを保持している可能性がある場合は、その型をコレクションの型パラメーターとして追加することをお勧めします。

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がそのような目的に役立ちます。

于 2013-09-07T19:55:56.250 に答える