次のような定義でメソッドを呼び出そうとしています (混乱を避けるために単純化されています)。
public static void Register<T>(T value) where T : BaseClass, IInterface
これらの値の両方を定義するクラス インスタンスがある限り、これは正常に機能します。「BaseClass」をメソッドに渡し、そのインスタンスを上記の宣言で使用しようとすると、問題が発生します。例えば:
public class MyClass
{
public MyClass(BaseClass value)
{
Register(value);
}
}
BaseClass と IInterface の両方を実装するクラスのインスタンスをコンストラクターに渡すことはできますが、Register
メソッドでその値を使用しようとすると、次のようなコンパイル エラーが発生します。
型 'BaseClass' は、ジェネリック型またはメソッド 'Register(T)' の型パラメーター 'T' として使用できません。「BaseClass」から「IInterface」への暗黙的な参照変換はありません。
コンストラクターで型を次のように変更すると、次のようになります。
public class MyClass
{
public MyClass(IInterface value)
{
Register(value);
}
}
次のようなエラーが表示されます。
型 'IInterface' は、ジェネリック型またはメソッド 'Register(T)' で型パラメーター 'T' として使用できません。「IInterface」から「BaseClass」への暗黙的な参照変換はありません。
これはちょっとしたキャッチ 22 のようです。 パラメータを定義して、BaseClass と IInterface の両方を実装する必要があることを示す方法はありますか?