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

本文关键字:有效 方差 类型参数 无效 | 更新日期: 2023-09-27 18:15:18

这有什么不对?

// 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.

但是,当我删除Task时,代码编译为:

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

为什么使接口异步导致它不能编译?

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

如上文Asad所述,Task<T>不能协变,因为它是。MSDN声明:

只有接口类型委托类型可以有变体类型参数。

如果存在协变ITask<T> 接口

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

干得好Jeff!