【问题标题】:Error: return keyword must not be followed by an object expression in c# async code错误:c#异步代码中的return关键字后面不能跟对象表达式
【发布时间】:2014-04-18 04:25:49
【问题描述】:
我在 C# 中有以下异步代码:
public async Task GetPhotos(List<int> photoIds)
{
List<Photos> photos = new List<Photos>();
if (photoIds != null)
{
foreach (int photoId in photoIds)
{
Photo photo = await ImageRepository.GetAsync(photoId);
if (photo != null)
photos.Add(photo);
}
}
return photos;
}
在返回语句中,我收到以下错误消息:
由于 GetPhotos(List photoIds) 是一个返回 'Task' 的异步方法,因此 return 关键字后面不能跟对象表达式。您是否打算返回“任务”?
如何解决这个错误??
【问题讨论】:
标签:
c#
asynchronous
async-await
task
task-parallel-library
【解决方案1】:
像这样更改您的返回类型Task<List<photos>>
public async Task<List<photos>> GetList()
{
List<Photos> photos = new List<Photos>();
if (photoIds != null)
{
foreach (int photoId in photoIds)
{
Photo photo = await ImageRepository.GetAsync(photoId);
if (photo != null)
photos.Add(photo);
}
}
return photos;
}
打电话
var list = await GetList()
【解决方案2】:
异步方法返回一个Task<T1,T2,T3...>,显示它是否完成并允许调用者使用.Result 或async 来检索返回值。
如果没有返回值,异步方法返回Task。它完成后什么也不返回。
你的方法被定义为返回一个Task,这意味着它在完成时什么也不返回,但在你的方法结束时你返回一个List<Photo>。因此,正确的返回类型应该是Task<List<Photo>>。
您不妨阅读this post。
另外,您的示例代码中有错字:List<Photos> -> List<Photo>。
【解决方案3】:
将方法的返回类型设为Task<List<Photos>> 而不是Task。当您致电GetPhotos 时,请使用
var photos = await GetPhotos
照片的类型为List<Photos>。 (await 关键字本质上是从Task 中提取List<Photos> 对象。)