方差无效:type参数必须是无变量有效的,但是是协变的

时间:2015-09-30 23:59:58

标签: c# generics asynchronous covariance

这有什么问题?

// does not compile
interface IRepository<out T>
{
    Task<T> Get(int id);
}

编译器抱怨:

Invalid variance: The type parameter 'T' must be invariantly valid on ... 'T' is covariant.

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

// compiles
interface IRepository<out T>
{
    T Get(int id);
}

为什么要使接口异步导致它无法编译?

1 个答案:

答案 0 :(得分:4)

正如Asad上面提到的,Task<T>不能协变,因为它是MSDN州:

  

只有界面类型委托类型才能拥有变体类型   参数。

如果只有协变ITask<T> 界面

经过一些谷歌搜索后,我在visualstudio.uservoice.com找到了这个建议。在评论中,Jeffrey Morse链接到他的implementation of ITask<T>

好工作杰夫!