【发布时间】:2015-09-08 21:50:36
【问题描述】:
class ResultBase {}
class Result : ResultBase {}
Task<ResultBase> GetResult() {
return Task.FromResult(new Result());
}
编译器告诉我它不能将Task<Result> 隐式转换为Task<ResultBase>。有人可以解释这是为什么吗?我本来希望协方差能够让我以这种方式编写代码。
【问题讨论】:
-
接口只能是协变或逆变的。类总是不变的。阅读更多:stackoverflow.com/questions/13107071/…
-
类在 C# 中是不变的。
-
来自this answer 似乎有人为此写了a covariant ITask<T> wrapper。也可以在a suggestion to implement it here 上投票。
-
在此示例中,您可以显式提供类型参数:
Task.FromResult<ResultBase>(new Result())。它会编译。但是是的,Task是不变的,这很糟糕。
标签: c# task covariance