用lambda语法重写

本文关键字:重写 语法 lambda | 更新日期: 2023-09-27 18:06:00

考虑以下表达式:

public override string ToString() => "ABCDEFG";

编译成:

public override string ToString()
{
    return "ABCDEFG";
}

尽管这个语法是语法糖,我希望ToString()等于Func<string>

Func<string> ToString = () => { return "ABCDEFG"; };

注意Func<string>需要一个return语句,但是ToString()覆盖的lambda语法不需要。

为什么重写的Lambda语法不需要使用return ?

用lambda语法重写

首先,它不是 lambda表达式—只是表达式体成员(在c# 6中引入)也使用=>的语法。它们不涉及创建委托实例或表达式树。

至于为什么不需要return—在lambda表达式中也不需要,当它们是表达式体lambda表达式时:

Func<string> toString = () => "ABCDEFG";

自c# 3中引入lambda表达式以来一直如此,并且是迄今为止LINQ中最常见的情况,例如

var query = strings.Where(x => x.Length > 3)
                   .Select(x => x.ToUpperInvariant());

这个c# 6的新特性被称为表达式体函数成员。虽然它确实看起来像一个lambda表达式,但它不是,因为它不计算为表达式。如前所述,它只是编译器的语法糖。