无效的方差:类型参数必须始终有效,但是是协变的

JDa*_*awg 4 c# generics asynchronous covariance

这有什么问题?

// does not compile
interface IRepository<out T>
{
    Task<T> Get(int id);
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

Invalid variance: The type parameter 'T' must be invariantly valid on ... 'T' is covariant.
Run Code Online (Sandbox Code Playgroud)

但是,当我删除任务时,代码将编译:

// compiles
interface IRepository<out T>
{
    T Get(int id);
}
Run Code Online (Sandbox Code Playgroud)

为什么使接口异步会导致其无法编译?

JDa*_*awg 5

如上所述,Asad Task<T>不能协变,因为它是一。在MSDN指出:

接口类型委托类型可以具有变量类型参数。

如果只有一个协变ITask<T> 接口

经过一番谷歌搜索后,我在visualstudio.uservoice.com上找到了建议。在评论中,Jeffrey Morse链接到他的实现ITask<T>

干得好杰夫!