【问题标题】:Override with lambda syntax用 lambda 语法覆盖
【发布时间】:2015-10-25 10:39:20
【问题描述】:

考虑以下表达式:

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

编译成这样:

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

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

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

请注意,Func&lt;string&gt; 需要 return 语句,但 ToString() 覆盖的 lambda 语法不需要。

为什么用于覆盖的 Lambda 语法不需要使用 return

【问题讨论】:

    标签: c# lambda roslyn c#-6.0


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我从来不知道你能做到这一点!
    • 你的意思是写“吉斯称它为alpha-4”吗?这似乎是一场意外。附:我等不及 C# 深度第 4 版了!
    • @Petrichor:抱歉,不,那是复制/粘贴失败。恐怕没有 C# in Depth 4th ed 在作品中。可以为 C# 7 做一个。
    • @JonSkeet - 我可以澄清一下,Lambda 语法和 Lambda 表达式之间有区别吗? - 因此可以将表达式体函数描述为使用 Lambda 语法,还是会造成混淆?
    • @series0ne:这仍然令人困惑,IMO - 人们自然会期望在 lambda 表达式中使用 lambda 语法。这两个语法元素只是使用相同的标记(=&gt;)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2019-07-12
      相关资源
      最近更新 更多