この記事では、C# で型推論を実装する際の課題について説明します。部分的なジェネリック型推論の制限と潜在的な解決策。
説明されている使用例は、メソッド引数に関連する汎用パラメーターを使用して、拡張メソッドが特定の基本クラスで使用可能である必要がある場合です。ただし、拡張メソッドは、呼び出された特定の子孫に関連する特定の型も返す必要があります。
結局のところ、部分的なジェネリック型推論は C# では直接サポートされていません。 。ただし、同様の結果を達成できる戦略があります。
方法 1: 型制約を使用する
構文type を使用して、目的のコードと同様のコードを実現できます。制約:
public static TReg Parameter<TReg, T>(this TReg p, string name, T value) where TReg : ParameterizedRegistrationBase
このアプローチでは、呼び出し時に両方のジェネリック型引数を指定する必要がありますが、これはすべての場合において望ましいとは限りません。
方法 2: Wrapper で 2 つの関数を使用する
このアプローチには、操作を 2 つに分割することが含まれます関数:
public static ThatAreWrapper<TSource> That<TSource>(this IEnumerable<TSource> source) { return new ThatAreWrapper<TSource>(source); } public class ThatAreWrapper<TSource> { // ... Implementation }
および:
listOfFruits.That().Are<Banana>().Where(banana => banana.Peel != Color.Black)
この回避策には追加の手順が必要ですが、結果の型をより柔軟に指定できます。
方法 3 : 基本クラスの拡張
拡張メソッドを基本クラスに直接導入すると、問題は解決されます。回避できる。ただし、このアプローチでは、将来他のクラスで拡張メソッドを使用できなくなります。
部分的なジェネリック型推論は C# では直接サポートされていませんが、提供できる回避策はあります。同様の機能。使用する具体的なアプローチは、関係する特定の要件とトレードオフによって異なります。
以上がC# は部分ジェネリック型推論を実装できますか?実装できる場合はどのように実装すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。