无效方差:类型参数必须始终有效,但是协变的
本文关键字:有效 方差 类型参数 无效 | 更新日期: 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!