使用lambda语法覆盖

时间:2015-08-03 10:46:45

标签: c# lambda roslyn c#-6.0

考虑以下表达式:

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

2 个答案:

答案 0 :(得分:13)

首先,不是一个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());

答案 1 :(得分:3)

这个新的C#6功能称为表达式身体功能成员。虽然它确实看起来像一个lambda表达式,但它没有,因为它没有计算表达式。正如您已经说过的那样,它只是编译器的语法糖。