如何定义可无限链式调用的累加器函数f(2)(3)(10)(100)?
实现支持无限链式调用的累加器函数
需求说明
f(2)返回 2f(2)(3)返回 5f(2)(3)(10)返回 15f(2)(3)(10)(100)返回 115f(2)(3)(10)(100)()()...可持续返回累加结果
现有尝试代码
static void Main() { Func<int, Func<int, int>> f = (x) => { return (y) => { return x += y; }; }; Console.WriteLine(f(2)(3)); // Console.WriteLine(f(2)(3)(10)); should return 15 }
注:不采用f(param int[] x){}这种参数数组的实现方式。
实现思路
核心是让每次调用后的返回值兼具两种能力:既能接收下一个整数参数继续累加,又能在无参数调用时返回当前总和。在C#中可以通过自定义类+方法重载+隐式转换来实现:
- 自定义累加器类,内部维护累加总和;
- 重载
Invoke方法:一种带int参数,累加后返回自身以支持链式调用;另一种无参数,直接返回当前总和; - 添加隐式转换为int的操作符,让类实例可以直接被当作整数输出;
- 入口函数
f接收初始值,返回累加器实例。
完整代码实现
using System; public class Accumulator { private int _total; public Accumulator(int initial) { _total = initial; } // 带参数调用:累加后返回自身,支持链式调用 public Accumulator Invoke(int num) { _total += num; return this; } // 无参数调用:返回当前累加结果 public int Invoke() { return _total; } // 隐式转换为int,直接输出实例时自动转换 public static implicit operator int(Accumulator acc) { return acc._total; } } class Program { static Accumulator f(int initial) { return new Accumulator(initial); } static void Main() { Console.WriteLine(f(2)); // 输出2 Console.WriteLine(f(2)(3)); // 输出5 Console.WriteLine(f(2)(3)(10)); // 输出15 Console.WriteLine(f(2)(3)(10)(100)); // 输出115 Console.WriteLine(f(2)(3)(10)(100)()); // 输出115 Console.WriteLine(f(2)(3)(10)(100)()()); // 输出115 } }
代码说明
f(initial)返回Accumulator实例,由于隐式转换为int,直接输出时会显示初始值;- 带参数的链式调用(如
f(2)(3))本质是调用Invoke(int),累加后返回自身,保证链式调用的连续性; - 无参数调用
()会触发Invoke(),直接返回当前总和,后续多次无参数调用也会持续返回该值; - 完全规避了参数数组的使用,严格符合需求。
内容的提问来源于stack exchange,提问作者D G
相关产品推荐
相关产品推荐

