我有一个委托参数的以下函数,该参数接受一个接口的类型并返回另一个接口的任务.
public void Bar(Func<IMessage, Task<IResult>> func)
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
我还有一个带参数的函数作为实例,IMessage并返回一个Task.Message和Result是的实现IMessage和IResult分别.
private Task<Result> DoSomething(Message m) { return new Task<Result>(() => new Result()); }
Run Code Online (Sandbox Code Playgroud)
当我将DoSomething传递到Bar时,我收到错误.
Bar(m => DoSomething((Message)m));
// Cannot convert type 'Task<Result>' to 'Task<IResult>'
Run Code Online (Sandbox Code Playgroud)
为什么不会Result隐式转换成IResult?
我认为这是协方差的一个问题.但是,在这种情况下,Result工具IResult.我还试图通过创建一个接口并标记TResult为协变来解决协方差问题.
public interface IFoo<TMessage, out TResult>
{
void Bar(Func<TMessage, Task<TResult>> func);
}
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
方差无效:类型参数'TResult'必须是无效的
IFoo<TMessage, TResult>.Bar(Func<TMessage, Task<TResult>>).'TResult'是协变的.
现在我被卡住了.我知道我有协方差的问题,但我不知道如何解决它.有任何想法吗?
编辑:此问题特定于任务.我async await在我的应用程序中实现了这个问题.我遇到了这个通用实现,并添加了一个Task …
c# ×1