C# 从任务内返回IEnumerable实现

C# 从任务内返回IEnumerable实现,c#,casting,task,ienumerable,C#,Casting,Task,Ienumerable,我可以做到: public static IEnumerable<string> Do() { return new List<string>(); } 公共静态IEnumerable Do() { 返回新列表(); } 但是如果我返回一个任务,我不允许做同样的事情: public static Task<IEnumerable<string>> DoTask() { return Task.Factory.StartNew(()

我可以做到:

public static IEnumerable<string> Do()
{
   return new List<string>();
}
公共静态IEnumerable Do()
{
返回新列表();
}
但是如果我返回一个任务,我不允许做同样的事情:

public static Task<IEnumerable<string>> DoTask()
{
    return Task.Factory.StartNew(() =>
    {
        return new List<string>(); //no no
    });
}
公共静态任务DoTask()
{
返回Task.Factory.StartNew(()=>
{
返回新列表();//否
});
}

我在.NET4.0中实现了一个异步存储库,并运行了该存储库。我只是好奇,为什么编译器在包装到任务中时不能将我的
列表
向下转换?当然,我的工作只是将
aseneumerable
放在上面,但我想知道为什么会存在这种限制?

任务
转换到
任务
需要协变且内部类型是接口。在这种情况下两者都不正确,因此不允许转换

明显的修复-通过显式指定lambda的类型,将
任务的结果转换为必需的类型

return Task.Factory.StartNew((Func<IEnumerable<string>>)
  (() =>
  {
    return new List<string>(); 
  }));
返回任务.Factory.StartNew((Func)
(() =>
{
返回新列表();
}));
或隐式地通过强制转换结果:

  return (IEnumerable<string>)new List<string>();
返回(IEnumerable)新列表();
详细资料-


为什么
Task
是TaskFactory.StartNew调用的结果:


传递给
StartNew
调用的Lambda未显式指定其类型,因此编译器从
return
语句推断其返回类型。由于
return
清楚地说明了
新列表…
lambda的总体类型在本例中与
Func
等效

任务
转换到
任务
需要协变,内部类型需要是接口。在这种情况下两者都不正确,因此不允许转换

明显的修复-通过显式指定lambda的类型,将
任务的结果转换为必需的类型

return Task.Factory.StartNew((Func<IEnumerable<string>>)
  (() =>
  {
    return new List<string>(); 
  }));
返回任务.Factory.StartNew((Func)
(() =>
{
返回新列表();
}));
或隐式地通过强制转换结果:

  return (IEnumerable<string>)new List<string>();
返回(IEnumerable)新列表();
详细资料-


为什么
Task
是TaskFactory.StartNew调用的结果:


传递给
StartNew
调用的Lambda未显式指定其类型,因此编译器从
return
语句推断其返回类型。由于
return
清楚地说明了
新列表…
lambda的总体类型在本例中与
Func
等效

应该是“为什么T:IT没有从
Type
转换到
Type
的重复项”。。。希望有人能找到准确的链接,或者简单地转发一个答案。当然,我不能正确地表达这个问题以找到一个重复的。如果回答了,我很乐意关闭它。不确定,但Actions(lambda)不返回类型,对吗?你得到了什么错误?@MVCDS type of
()=>return new X()
在这个上下文中是
Func
,而不是
Action
,因为lambda返回值(也添加了类似的信息来回答)。很好的解释,@alexeilevenkov应该是“为什么T:IT没有从
type
转换为
type
”。。。希望有人能找到准确的链接,或者简单地转发一个答案。当然,我不能正确地表达这个问题以找到一个重复的。如果回答了,我很乐意关闭它。不确定,但Actions(lambda)不返回类型,对吗?你得到了什么错误?@MVCDS类型的
()=>return new X()
在此上下文中是
Func
,而不是
Action
,因为lambda是返回值(也添加了类似的信息来回答)。很好的解释,@AlexeiLevenkovNote:应该是重复的,但我还找不到好的重复答案。注意:应该是重复的,但我还没有找到好的答案。