ASP.NET Core中DeleteCharacter方法CS0029类型转换错误求助
解决CS0029类型转换错误:Task与ServiceResponse的隐式转换问题
错误原因
DeleteCharacter方法声明返回Task<ServiceResponse<List<GetCharacterDTO>>>,但实际返回的是ServiceResponse<List<GetCharacterDTO>>实例,两者类型不匹配。而正常运行的UpdateCharacter方法因为加了async关键字,编译器会自动将返回值包装成Task,所以无错误。
解决方案
方案一:添加async关键字(推荐,与现有代码风格一致)
给DeleteCharacter方法添加async修饰符,编译器会自动处理Task包装:
public async Task<ServiceResponse<List<GetCharacterDTO>>> DeleteCharacter(int id) { var serviceResponse = new ServiceResponse<List<GetCharacterDTO>>(); try { var character = characters.First(c => c.Id == id); if (character is null) { throw new Exception($"Character with Id '{id}' not found"); } characters.Remove(character); serviceResponse.Data = characters.Select(c => _mapper.Map<GetCharacterDTO>(c)).ToList(); } catch (Exception ex) { serviceResponse.Success = false; serviceResponse.Message = ex.Message; } return serviceResponse; }
即使方法内没有await调用,async关键字依然有效,编译器会生成已完成的Task包装返回值。
方案二:手动包装为Task
若不想加async,用Task.FromResult()手动包装返回值:
public Task<ServiceResponse<List<GetCharacterDTO>>> DeleteCharacter(int id) { var serviceResponse = new ServiceResponse<List<GetCharacterDTO>>(); try { var character = characters.First(c => c.Id == id); if (character is null) { throw new Exception($"Character with Id '{id}' not found"); } characters.Remove(character); serviceResponse.Data = characters.Select(c => _mapper.Map<GetCharacterDTO>(c)).ToList(); } catch (Exception ex) { serviceResponse.Success = false; serviceResponse.Message = ex.Message; } return Task.FromResult(serviceResponse); }
为什么UpdateCharacter方法没问题?
UpdateCharacter方法带有async关键字,C#编译器会自动触发"异步状态机"转换,将返回的ServiceResponse<GetCharacterDTO>自动包装成Task<ServiceResponse<GetCharacterDTO>>,因此不会出现类型转换错误。
内容的提问来源于stack exchange,提问作者DJ Eddie J
相关产品推荐
相关产品推荐

