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

如何实现可接收方法参数的通用嵌套循环方法并解决调用错误

解决通用嵌套循环方法的委托传递问题

我来帮你搞定这个问题,你的思路非常合理——把重复的嵌套循环逻辑抽成通用方法,通过传入不同的业务方法来复用循环,这正是C#委托的典型应用场景,只是在委托类型选择和调用方式上出了两个小问题,咱们一步步修正:

先解释你遇到的两个错误

  1. "未为CreateColumns的必需形参PositionX提供实参":你调用Loop(CreateColumns());的时候加了括号,这会让编译器直接尝试执行CreateColumns方法,但它需要两个double参数,自然会报错。正确的做法是直接传递方法本身(方法组),而不是执行它的结果。
  2. "Delegate 'Func' does not take 2 arguments":你用的Func<ModelObject>是无输入参数、返回ModelObject的委托类型,但你的业务方法需要接收两个double参数,所以得用匹配的泛型Func版本:Func<double, double, ModelObject>——记住,Func委托的最后一个类型参数是返回值类型,前面的都是输入参数的类型。

修正后的通用Loop方法

把委托类型改成匹配业务方法的签名,代码如下:

public static void Loop(Func<double, double, ModelObject> myMethod) 
{ 
    for (double PositionX = 0.0; PositionX <= 12000.0; PositionX += 3000.0) 
    { 
        for (double PositionY = 0.0; PositionY <= 30000.0; PositionY += 6000.0) 
        { 
            // 传入循环变量作为参数调用委托
            myMethod(PositionX, PositionY); 
        } 
    } 
}

正确调用Loop方法

调用时直接传递方法名(方法组),不需要加括号,编译器会自动把它转换成对应的委托:

// 正确调用:传递方法本身,而非执行方法的结果
Loop(CreateColumns);

扩展:支持泛型返回类型

如果以后你的业务方法需要返回不同类型的对象,咱们可以把Loop改成泛型方法,这样就不用为每个返回类型写新的Loop方法了:

public static void Loop<T>(Func<double, double, T> myMethod) 
{ 
    for (double PositionX = 0.0; PositionX <= 12000.0; PositionX += 3000.0) 
    { 
        for (double PositionY = 0.0; PositionY <= 30000.0; PositionY += 6000.0) 
        { 
            myMethod(PositionX, PositionY); 
        } 
    } 
}

调用时编译器会自动推断返回类型,也可以显式指定:

// 自动推断返回类型为ModelObject
Loop(CreateColumns);
// 显式指定类型(可选,当编译器无法推断时使用)
Loop<ModelObject>(CreateColumns);

额外说明

如果你的某些业务方法是无返回值(void)的,那就要用Action<double, double>委托代替Func,用法和上面一致,只是委托类型不同而已。

内容的提问来源于stack exchange,提问作者Ryan Daley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:22:46