C# では、特定の要件が確実に満たされるように、ジェネリック メソッドに制約を設定できます。一般的な制約は、ジェネリック型にはパラメーターなしのコンストラクターが必要であることを指定することです。ただし、当然の疑問が生じます。コンストラクターにより具体的な制約を課すことはできるのでしょうか?
質問に示されている例を見てみましょう。ここでは、float[,] パラメータを受け入れるコンストラクターを強制します。最初の試行:
<code class="language-c#">public static T Method<T>(T a) where T : new(float[,] u) { //...do something... return new T(new float[0, 0]); }</code>
コンパイルに失敗したため、代替手段を探す必要がありました。
この制限を回避するために、タイプ T のインスタンスの作成を担当するデリゲートを導入するという回避策を採用しました。このデリゲートは必要なパラメータをパラメータとして受け取り、T のインスタンスを返します。
<code class="language-c#">public static void Method<T>(T a, Func<float[,], T> creator) { //...do something... }</code>
このデリゲートを使用するようにコードを変更すると、次の結果になります:
<code class="language-c#">A.Method(float[,], instanceCreator); Func<float[,], T> instanceCreator = (float[,] arr) => new T(arr);</code>
このソリューションでは、適切なデリゲートを渡すことで、コンストラクターにさらに複雑な制約を課すことができます。
以上がC# のジェネリック コンストラクターは、パラメーターのないコンストラクターを超えて特定のパラメーターの型を強制できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。