You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:27:02