使用 lambda 语法覆盖
Override with lambda syntax
考虑以下表达式:
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 表达式——只是表达式主体成员(在 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 表达式,但它是 none 因为它不计算为表达式。正如您已经说过的,它只是编译器的语法糖。
考虑以下表达式:
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 表达式——只是表达式主体成员(在 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 表达式,但它是 none 因为它不计算为表达式。正如您已经说过的,它只是编译器的语法糖。