Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
150 views
in Technique[技术] by (71.8m points)

c# - Type conversion error with async programming

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:UsersJaymieDocumentsGitHubSkipstoneSkipstone.WebRepositoriesUserRepository.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 :)

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...