オープンおよびクローズの構築型はメソッドのパラメータとして使用できます:
void Swap(List list1, List list2) {…} void Swap(List list2) {…}
| 6. 汎用インターフェース
インターフェースを型パラメータの制約として指定する場合、そのインターフェースを実装する型のみを汎用インターフェースとして使用できます。パラメータを入力します。
次のように、型の制約として複数のインターフェイスを指定できます:
class Stack where T : IComparable, IMyStack1{}
| インターフェイスでは、次のように複数の型パラメータを定義できます:
インターフェイスとクラスの継承規則は同じです:
//わかりました。 IMyInterface: IBaseInterface //わかりました。 IMyInterface : IBaseInterface2< U 型クラスは、クラスのパラメータ リストが必要なパラメータをすべて提供している限り、ジェネリックス インターフェイスまたは閉じた構造インターフェイスを実装できます。次のようにインターフェースによって:
//Yeah. | class MyClass : IBaseInterface //Healthy.class MyClass : IBaseInterface
ジェネリック クラス、ジェネリック構造、ジェネリック インターフェイスにはすべて同じメソッド オーバーロード ルールがあります。
7. ジェネリックメソッド |
ジェネリックメソッドは、次のように型パラメータを宣言するメソッドです:
void Swap(ref T lhs, ref T rhs) { T temp; temp = lhs; lhs = rhs; rhs = temp; }
|
次のサンプル コードは、型パラメーターとして int を使用してメソッドを呼び出す例を示しています。
int a = 1;int b = 2;//…Swap(a, b);
型パラメータを無視することもでき、コンパイラは推測してみてください。 Swap を呼び出す次のコードは、上記の例と同等です:
Swap(a, b);
| 静的メソッドとインスタンス メソッドには、同じ型推論ルールがあります。コンパイラは、渡されたメソッド パラメータに基づいて型パラメータを推測できますが、制約や戻り値のみに基づいて決定することはできません。したがって、型推論はパラメータのないメソッドに対しては無効です。型推論は、コンパイラがオーバーロードされたメソッド フラグを解決する前に、コンパイル時に行われます。コンパイラは、同じ名前を持つすべてのジェネリック メソッドに型推論ロジックを適用します。オーバーロードの解決フェーズでは、コンパイラには、型推論が成功したジェネリック クラスのみが含まれます。 ジェネリック クラスでは、非ジェネリック メソッドはクラス内の型パラメーターにアクセスできます:
class List { void Swap(ref T lhs, ref T rhs) { ... } } |
ジェネリック クラスで、そのメソッドが配置されているクラスと同じ型パラメータを持つジェネリック メソッドを定義しようとすると、コンパイラによって警告 CS0693 が生成されます。 。
| class List T>の型パラメータは同じ名前を持っています
ジェネリック クラスで、ジェネリック クラス内の未定義の型パラメーターを定義するためのジェネリック メソッドを定義します。 (一般的には使用されず、制約とともに使用されます)
class List { void Swap< U>(ref T lhs, ref T rhs) { // 一般的には使用されません
void Add(List items) where U : T{} // 一般的に使用されます }
| ジェネリック メソッドは、複数の型パラメーターでオーバーロードされます。たとえば、次のメソッドを同じクラスに配置できます。
void DoSomething() { } void DoSomething() { } void DoSomething() { } |
8. ジェネリックスのデフォルトキーワード
ジェネリッククラスとジェネリックメソッドで発生する問題は、パラメータ化された型にデフォルト値をどのように割り当てるかです。現時点では、それを知ることは不可能です。事前に次の 2 つのことを確認してください:
- T は値型または参照型になります
- T が値型の場合、T は数値または構造体になります
パラメーター化された型の場合 T の変数 t の場合、 t = null ステートメントは T が参照型である場合にのみ有効です。 t = 0 は数値に対してのみ有効であり、構造体に対しては無効です。この問題の解決策は、default キーワードを使用することです。このキーワードは、参照型の場合は null を返し、値の型の場合は 0 を返します。構造体の場合、構造体の各メンバーを返し、メンバーが値型であるか参照型であるかに応じて 0 または null を返します。
|