次のようなインターフェースがあるとします
public interface IInterface<in TIn, out TOut> {
IInterface<TIn, TOut> DoSomething(TIn input);
}
TIn
反変であり、TOut
共変です。
ここで、呼び出し元が入力の値に対して実行される関数を指定できるようにしたいので、単純に次のメソッドをインターフェイスに追加します。
IInterface<TIn, TOut> DoSomethingWithFunc(Func<TIn, TOut> func);
これは…機能しません。TIn
共変であり、反変である必要がありますTOut
。
メソッドの入力として共変のジェネリック型を使用できないことは理解していますが、それ自体がバリアンス ( Func<in T1, out TResult>
) を指定するネストされたジェネリック型で使用できると考えました。
co-/contravariant 型で新しいデリゲート型を作成しようとしましたが、この型の引数を受け入れるようにインターフェイスを変更しましたが、役に立ちませんでした (同じエラー)。
public delegate TOut F<in TDlgIn, out TDlgOut>(TDlgIn input);
public interface IInterface<in TIn, out TOut> {
IInterface<TIn, TOut> DoSomethingWithFunc(F<TIn, TOut> func);
}
コンパイラを満足させる方法はありますか? これは可能ですか (たとえば、他のネストされた型、または追加のジェネリック引数を使用)? そうでない場合、なぜですか?