Type conversion error with async programming

2019-08-02 21:28发布

Can anyone tell me why this is not working?

I have a method that looks like this:

public virtual async Task<IList<User>> GetAll()
{
    return this.db.Users.Where(model => model.CompanyId.Equals(this.companyId, StringComparison.OrdinalIgnoreCase)).ToListAsync();
}

when I try to compile my code I get an error stating:

Error 10 Cannot implicitly convert type 'System.Threading.Tasks.Task>' to 'System.Collections.Generic.IList'. An explicit conversion exists (are you missing a cast?) C:\Users\Jaymie\Documents\GitHub\Skipstone\Skipstone.Web\Repositories\UserRepository.cs 70 20 Skipstone.Web

Yet directly under it I have this method:

public Task<User> FindByIdAsync(string userId)
{
    return this.db.Users.Where(model => model.Id.Equals(userId, StringComparison.OrdinalIgnoreCase)).SingleOrDefaultAsync();
}

which works fine.

I think I can't see the wood for the trees so need someone else's eyes to help me out :)

2条回答
走好不送
2楼-- · 2019-08-02 21:57

If you are using async keyword, then you need use await keyword return original type .

public virtual async Task<IList<User>> GetAll()
{
    return await this.db.Users.Where(model =>
         model.CompanyId.Equals(this.companyId, 
              StringComparison.OrdinalIgnoreCase)).ToListAsync().ConfigureAwait(false);;
}

Or without async you need to specify type Task as you did in the second sample that is working.

查看更多
The star\"
3楼-- · 2019-08-02 22:08

The ToListAsync methods return a Task<List<T>> object, which translate to a Task<List<User>> object in your case, but your method's return type is Task<IList<User>>.

The issue here is that covariance is not supported for T in Task<T>.

So, either you change the method's return type to Task<List<User>>, or you write the code to make the conversion yourself:

return this.db.Users
    .Where(model => model.Id.Equals(userId, StringComparison.OrdinalIgnoreCase))
    .ToListAsync()
    .ContinueWith<IList<User>>(t => t.Result, TaskContinuationOptions.ExecuteSynchronously);
查看更多
登录 后发表回答