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

如何将带参数的async Task作为方法参数传递?代码报错求助

C#代码错误修复方案

错误原因

  1. 第21行:Delegate 'Func' does not take 2 arguments
    你声明的Func<Task>是无参数委托,但调用printer(c, c)时传入了两个字符串参数,委托类型与调用方式不匹配。需要将委托类型改为接受两个string参数并返回Task的Func<string, string, Task>。

  2. 第28行:无法从'Task'转换为'Func'
    Print1(a,b)是直接执行方法,返回的是Task实例,但PrintLoop需要的是方法委托(方法的引用),而非方法执行后的结果。你需要传递方法本身,而非调用方法后的返回值。

修复后的完整代码

using System;
using System.Threading.Tasks;
using System.Diagnostics; 

public class HelloWorld
{
    async Task Print1(string a, string b)
    {
        Debug.WriteLine("Printing!");
    }
    
    // 更新委托类型为接受两个string参数的Func<string, string, Task>
    async Task PrintLoop(Func<string, string, Task> printer, int iterations = 3)
    {
        for (int i = 0; i < iterations; i++)
        {
            string c = "1";
            await printer(c, c);
        }
    }
    
    async Task Main()
    {
        string a ="";
        string b = "";
        // 传递方法组Print1,而非调用后的Task实例
        await PrintLoop(Print1);
        
        // 若需固定传入a、b而非循环中的c,可改用lambda表达式:
        // await PrintLoop((_, _) => Print1(a, b));
    }
}

补充说明

  • 方法组Print1可以直接匹配Func<string, string, Task>类型,因为它的参数数量、类型和返回值都与委托定义一致。
  • 如果你的需求是在循环中始终使用初始的a和b,而非每次迭代生成的c,可以用lambda表达式忽略循环传入的参数,直接调用Print1(a,b)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:01:02