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

C#如何正确声明带有out参数的委托类型

解决方案

C# 内置的 Func/Action 系列泛型委托不支持携带 out/ref/in 参数修饰符,你需要自行声明匹配签名的委托类型,有两种常用实现方式:


方式1:自定义匹配当前场景的专用委托

直接声明和你的TryCalculate签名完全一致的委托:

// 声明带out参数的委托类型
public delegate bool TryCalculateDelegate(out Data data);

之后修改Calculate方法的参数类型即可:

void Calculate(TryCalculateDelegate tryCalculate)
{
    if (tryCalculate(out var data))
        DoSomething(data);
    
    // 其余逻辑
}

原有调用逻辑Calculate(TryCalculate);不需要做任何修改。


方式2:定义通用的带out参数的泛型委托

如果需要多处使用类似结构的out参数委托,可以定义通用版本复用:

// 通用单out参数、带返回值的委托模板
public delegate TResult FuncOut<TArg, TResult>(out TArg arg);

此时Calculate方法的参数可以直接用通用委托,不需要单独声明专用类型:

void Calculate(FuncOut<Data, bool> tryCalculate)
{
    if (tryCalculate(out var data))
        DoSomething(data);
    
    // 其余逻辑
}

原写法错误原因

  • Func<Data, bool>的签名是bool 方法名(Data data),参数没有out修饰,和目标方法签名不匹配,因此触发CS1615错误
  • Func<out Data, bool>中的out是C#泛型的协变修饰符,作用于泛型参数本身,和方法参数的out修饰符完全是两个语义,无法实现需求。

内容的提问来源于stack exchange,提问作者Daniil Palii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:54:04