【问题标题】:Translating anonymous methods into lambda expression将匿名方法转换为 lambda 表达式
【发布时间】:2013-04-24 05:04:02
【问题描述】:

如果我要翻译这个匿名方法:

Func<int, int> f = delegate(int i)
{
     return i + 1;
};

转换成一个 lambda 表达式,它会是这样的:

Func<int, int> f = i => i + 1;

(我知道:这个 lambda 表达式会秘密生成另一个匿名方法(由编译器),但这不是重点)。

现在我想把下面的方法翻译成一个 lambda 表达式:

Func<int, int> f = delegate(int i)
{
     Debug.WriteLine("Inside the function!");
     return i + 1;
};

有没有办法,我该怎么做?

【问题讨论】:

  • “一个 lambda 表达式会偷偷生成另一个 anymous 方法”是什么意思?这不是真的......(在IL中会为either一个lambda表达式一个匿名方法生成一个方法,但它不像lambda表达式被翻译成然后正常编译的匿名方法。)
  • @Jon:据我所知,只有当 f 类型为 Expression&lt;Something&gt; 时才会创建 lambda 表达式。在这种情况下,f 是一个委托,这会强制编译创建一个匿名方法,不是吗?
  • 不,你很困惑。 i =&gt; i + 1 一个 lambda 表达式。 lambda 表达式和匿名方法都是 source 级别 构造,并且都可以转换为委托类型。此外,lambda 表达式可以转换为表达式树。
  • @Jon:我同意你所说的一切。但我仍然看不出我的问题有什么“错误”。如果我在该行中将“a”一词替换为“this”,它会改变吗?
  • 您所说的 lambda 表达式生成匿名方法的事实要么是错误的,要么是措辞非常糟糕。不清楚您的意思,您之前关于“仅创建 lambda 表达式...”的评论绝对是错误的。

标签: c# lambda anonymous-methods


【解决方案1】:

Lambda 可以包含多行,这种情况下的语法类似于 C# 2.0 中的匿名委托:

Func<int, int> f = i =>
{
     Debug.WriteLine("Inside the function!");
     return i + 1;
};

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 2011-09-22
    • 1970-01-01
    • 2013-07-16
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多