C#ジェネリック「where制約」と「任意のジェネリック型」の定義?


113

例を挙げましょう。

  1. 私はいくつかの一般的なクラス/インターフェースの定義を持っています:

    interface IGenericCar< T > {...}

  2. 上記のクラスに関連付けたい別のクラス/インターフェイスがあります。次に例を示します。

    interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}

基本的に、またはにIGenericCar関係なく、ジェネリックIGarrageがに依存するようにします。これは、その型に依存しないためです。IGenericCar<int>IGenericCar<System.Color>

回答:


142

これを実現するには、通常2つの方法があります。

Option1:制約に渡す必要があるをIGarrage表す別のパラメーターを追加TIGenericCar<T>ます。

interface IGarrage<TCar,TOther> where TCar : IGenericCar<TOther> { ... }

オプション2IGenericCar<T>ジェネリックではない基本インターフェースを定義し、そのインターフェースを制約する

interface IGenericCar { ... }
interface IGenericCar<T> : IGenericCar { ... }
interface IGarrage<TCar> where TCar : IGenericCar { ... }

6
わかりましたが、T内部でジェネリック型を使用する必要がある場合はどうすればよいIGarage<TCar>ですか?option2で可能性を見つけることができません。最善の解決策は、IGarage<TCar>タイプTを分析してタイプを見つけた場合TCarです。
pt12lol

2
後世のために、生のジェネリック型の型パラメーターを持つ型を作成できますが、実行時のリフレクションのみで、完全な定義なしに生のジェネリック型パラメーターを自動的に構築することはできないため、作成されたクラスを構築することはできません。 ITSのそれぞれのタイプパラメータ。一番外側のクラスの超汎用静的メンバー(つまりIGarage<IGenericCar<?>>.TellMeAboutCarsInGeneral()、デザインが悪いためと思われる)の場合を除いて、これがどこに役立つかはわかりませんが、いじくり回してそれを行いました。可能です。
Michael Hoffmann

誰でもIGenericCarインターフェイスをクラスに追加して、制約されたメソッドを予期しないクラスで壊すことができると思います。
N-ate

2
@ pt12lol:IGarrage<TCar>基になるジェネリック型を実際に処理する場合(たとえば、上記の型のプロパティを処理する場合)は、型を知る必要があります。そのため、型を指定する必要があります。つまり、オプション1(そのとき実行できる唯一のオプション)です。ただし、IGarrage<TCar>が基になるジェネリック型を直接処理しない場合(すべてのIGarrage<TCar>コードはこの基になる型に依存しません)、オプション2は有効です。
2018年

6

次のようなことをしても意味がありますか?

interface IGenericCar< T > {...}
interface IGarrage< TCar, TCarType > 
    where TCar: IGenericCar< TCarType > {...}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.