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:应该是重复的,但我还找不到好的重复答案。注意:应该是重复的,但我还没有找到好的答案。