【发布时间】:2020-12-16 08:41:29
【问题描述】:
我有这个代码:
static List<string> lst = new List<string>();
public static Task<IEnumerable<String>> GetStrings() {
IEnumerable<String> x = lst;
// This line below compiles just fine.
// return Task.Run(() => x);
// This line gives a compiler error:
// Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Collections.Generic.List<string>>' to
// 'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<string>>'
return Task.Run(() => lst);
}
为什么这行编译得很好:return Task.Run(() => x);
而return Task.Run(() => lst); 给出编译器错误:
不能隐式转换类型 'System.Threading.Tasks.Task
' 到 'System.Threading.Tasks.Task '
我认为既然List<string> 是IEnumerable<string>,我不应该显式设置x。我的意思是,编译器知道lst 是IEnumerable<string>。
我想我一定遗漏了一些基本的东西。
【问题讨论】:
-
你可以用
Task.Run(() => (IEnumerable<String>)lst);修复它 -
错误是关于
Task<T>类型,而不是 List 和 IEnumerable。仅仅因为类型参数具有继承关系并不意味着泛型类型也具有这种关系 -
Task<TResult>不是covariant。 -
Task<T>没有将T声明为out T但IEnumerable声明
标签: c#