C#如何修改委托声明以适配带out参数的async/await异步方法
C# 同步委托改造为async/await异步形式解决方案
报错原因
- 报错2是核心问题:
async修饰的方法不允许返回普通值类型,仅支持返回void、Task、Task<T>三类值;同时异步方法禁止使用out、ref类型的参数。 - 报错1是衍生问题:你修改了方法签名但没有匹配委托要求,导致方法和委托签名不兼容,编译器无法识别正确的方法映射,触发二义性报错。
具体修改方案
1. 修改委托定义
移除out参数,将返回值改为Task<>包裹的元组,同时承载原来的bool返回值和User输出参数:
// 新的异步委托定义:返回Task<元组>,元组第一项为操作是否成功,第二项为获取到的User对象 public delegate Task<(bool IsSuccess, User User)> GetUserFromAccessTokenHandler(string token); // 委托字段声明同步修改类型 public GetUserFromAccessTokenHandler GetUserFromAccessToken;
2. 调整构造函数绑定逻辑
构造函数的委托绑定逻辑不需要大幅改动,只要方法签名匹配就可以正常绑定:
public FunctionalOperations(IUnitOfWork unitOfWork) { GetUserFromAccessToken = new GetUserFromAccessTokenHandler(GetUserFromAccessTokenFunction); _unitOfWork = unitOfWork; }
3. 重写异步方法实现
调整返回值类型,删除out参数,正常编写异步逻辑即可:
private async Task<(bool IsSuccess, User User)> GetUserFromAccessTokenFunction(string token) { // 执行异步查询 var user = await _unitOfWork.User.Get(.../*你的查询条件*/); // 组装元组返回,可根据业务逻辑调整成功判断规则 return (user != null, user); }
4. 调用示例
调用该委托时直接用await接收结果即可:
var (isSuccess, user) = await GetUserFromAccessToken("你的access_token"); if(isSuccess) { // 执行业务逻辑 }
内容的提问来源于stack exchange,提问作者nour
相关产品推荐
相关产品推荐

