为什么Task.FromResult需要显式强制转换?

时间:2018-07-30 16:58:22

标签: c#

我有以下程序:

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?

1 个答案:

答案 0 :(得分:4)

  

为什么无法弄清楚我的方法返回了IList<int>任务?

因为不是。在此通话中:

Task.FromResult(new List<int>());

...类型推断使其等同于:

Task.FromResult<List<int>>(new List<int>());

因此您的方法正在尝试返回Task<List<int>>-与Task<IList<int>>不兼容。

为了简化关于Task<>的观点,我们改用stringobject,然后完全删除类型推断和异步。以下代码无法编译,并且实际上不应编译:

Task<string> stringTask = Task.FromResult<string>("text");
Task<object> objectTask = stringTask; // Doesn't compile

Task<T>不变-从Task<T1>Task<T2>没有转换,只是因为从T1T2有转换

尽管您不需要显式转换-您可以更早地使用隐式转换:

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>());
}