我有以下程序:
async Task Main()
{
IList<int> myList = await TestAsync();
}
public Task<IList<int>> TestAsync()
{
return Task.FromResult(new List<int>());
}
编译器抱怨无法通过Task<List>
方法将Task<IList>
转换为TestAsync
:
CS0029无法隐式转换类型
System.Threading.Tasks.Task<System.Collections.Generic.List<int>>
至System.Threading.Tasks.Task<System.Collections.Generic.IList<int>>
为什么不能弄清楚我的方法返回了IList的Task?
答案 0 :(得分:4)
为什么无法弄清楚我的方法返回了
IList<int>
任务?
因为不是。在此通话中:
Task.FromResult(new List<int>());
...类型推断使其等同于:
Task.FromResult<List<int>>(new List<int>());
因此您的方法正在尝试返回Task<List<int>>
-与Task<IList<int>>
不兼容。
为了简化关于Task<>
的观点,我们改用string
和object
,然后完全删除类型推断和异步。以下代码无法编译,并且实际上不应编译:
Task<string> stringTask = Task.FromResult<string>("text");
Task<object> objectTask = stringTask; // Doesn't compile
Task<T>
是不变-从Task<T1>
到Task<T2>
没有转换,只是因为从T1
到T2
有转换
尽管您不需要显式转换-您可以更早地使用隐式转换:
public Task<IList<int>> TestAsync()
{
// It's important that this variable is explicitly typed as IList<int>
IList<int> result = new List<int>();
return Task.FromResult(result);
}
这使用List<int>
变量从IList<int>
到result
的隐式转换,然后使用类型推断调用Task.FromResult<IList<int>>
。
另一种方法是保持方法不变,除非您为Task.FromResult
指定类型参数:
public Task<IList<int>> TestAsync()
{
return Task.FromResult<IList<int>>(new List<int>());
}