假设我有这样一个接口:
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>
)。
我尝试创建一个具有协变/抗变类型的新委托类型,并更改接口以接受此类型的参数,但结果没有成功(相同的错误)。
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);
}
有没有办法让编译器满意?这是否可能(例如使用其他嵌套类型或额外的泛型参数)?如果不行,为什么?
delegate TOut F<out TDlgIn, in TDlgOut>(TDlgIn input)
吗?当传递委托时,协变/逆变需要反过来。 - Stefan Steinegger