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
相关产品推荐
相关产品推荐

