假设我有一个界面,例如
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);
}
我有办法让编译器开心吗?这甚至可能吗(例如使用其他嵌套类型或其他泛型参数)?如果不是,为什么不呢?