如何将带参数的async Task作为方法参数传递?代码报错求助
C#代码错误修复方案
错误原因
第21行:Delegate 'Func' does not take 2 arguments
你声明的Func<Task>是无参数委托,但调用printer(c, c)时传入了两个字符串参数,委托类型与调用方式不匹配。需要将委托类型改为接受两个string参数并返回Task的Func<string, string, Task>。第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
相关产品推荐
相关产品推荐

