C#高阶函数SwapArgs中为何两次使用=>?请技术解析
为什么SwapArgs方法里用了两次
=>? 我们把代码拆成两部分分析,就能明白两个=>的不同作用:
第一个=>:表达式体方法语法
C# 6及以后支持表达式体方法,当方法逻辑只有一行返回语句时,可以用=>替代传统的{ return ...; }写法。比如SwapArgs的完整写法是:
static Func<T2, T1, R> SwapArgs<T1, T2, R>(this Func<T1, T2, R> f) { return (t2, t1) => f(t1, t2); }
用表达式体简化后,就变成了你看到的:
static Func<T2, T1, R> SwapArgs<T1, T2, R>(this Func<T1, T2, R> f) => /* 返回值 */;
这里的第一个=>只是方法定义的语法糖,替代了方法体的大括号和return关键字。
第二个=>:Lambda表达式语法
SwapArgs方法需要返回一个Func<T2, T1, R>类型的委托,这个委托的实现就是一个lambda表达式:(t2, t1) => f(t1, t2)。这和你例子里的divide变量赋值逻辑完全一致——它定义了一个接受t2和t1两个参数、执行f(t1, t2)并返回结果的函数。
对比你的divide例子
divide是一个委托变量,用lambda表达式直接赋值给它,结构是变量 = 参数 => 函数体。而SwapArgs是一个方法,它的返回值是一个lambda表达式,所以用表达式体方法语法(第一个=>)把方法体简化为直接返回这个lambda(第二个=>定义的函数)。
总结:
- 第一个
=>属于方法定义的语法,用来简化单返回值的方法体 - 第二个
=>属于Lambda表达式的语法,用来定义要返回的委托实例
内容的提问来源于stack exchange,提问作者Lazar Grbovic
相关产品推荐
相关产品推荐

