关于以防万一,C# 匿名方法的语法比 lambda 表达式的语法更简单。 Book:Professional C# 5.0 和 .NET 4.5.1

About in case,C# the syntax of anonymous methods simpler than syntax of lambda expressions. Book:Professional C# 5.0 and .NET 4.5.1

最近,我读了"Professional C# 5.0 and .NET 4.5.1 by Christian Nagel; Jay Glynn; Morgan Skinner"本书。 我很困惑:"in case,the syntax of anonymous methods simpler than syntax of lambda expressions" 在书中。

Details in Chapter 8: Delegates, Lambdas, and Events

LAMBDA EXPRESSIONS "NOTE The syntax of lambda expressions is simpler than the syntax of anonymous methods. In a case where a method to be invoked has parameters and you don’t need the parameters, the syntax of anonymous methods is simpler, as you don’t need to supply parameters in that case."

任何人都可以 explain/sample 为什么在那种情况下匿名方法不需要提供参数?

Can anyone explain/sample why anonymous methods don't need to supply parameters in that case?

因为如果您不使用委托参数,您可以让编译器自动为您生成它们。

示例:

internal delegate void MyDelegate(string s);

public class Foo
{
    public void F()
    {
        MyDelegate del = delegate { Console.WriteLine("hello!"); };
    }
}

当我没有指定任何参数时(因为我没有在我的委托中明确使用它们),编译器将其翻译成以下内容:

public void F()
{
    MyDelegate del = delegate(string param0)
    {
        Console.WriteLine("hello!");
    };
}

或者如果你想要真正的下流东西:

[CompilerGenerated]
private static void <F>b__0(string param0)
{
    Console.WriteLine("hello!");
}

public void F()
{
    if (Foo.CS$<>9__CachedAnonymousMethodDelegate1 == null)
    {
        Foo.CS$<>9__CachedAnonymousMethodDelegate1 = new MyDelegate(Foo.<F>b__0);
    }
    MyDelegate del = Foo.CS$<>9__CachedAnonymousMethodDelegate1;
}

因为这是有效的

Func<int,int> f = delegate { return 47; }

但这不是

Func<int,int> f = () =>  47;

使用匿名方法语法,您可以在不需要时省略参数。但是在 lambda 表达式中你必须提供参数。

这在documentation中也有说明:

There is one case in which an anonymous method provides functionality not found in lambda expressions. Anonymous methods enable you to omit the parameter list.This means that an anonymous method can be converted to delegates with a variety of signatures.

如果您的方法需要一个参数,您需要 define/use 它要么是 lambda 表达式,要么是匿名方法。
假设您有一个如下声明的委托。

public delegate void PrintDelegate(string message);

您可以像下面那样为其分配 lambda 表达式或匿名方法

Lambda 表达式

PrintDelegate p1 = message => { Console.WriteLine(message); };

匿名表达

PrintDelegate p2 = delegate(string text) { Console.WriteLine(text); };

在这两个中您都可以看到参数已被定义。
但是,如果你想将委托挂钩到另一个具有相同签名的方法,你可以像下面那样做。

PrintDelegate p1 = Console.WriteLine;

Console.WriteLine 与定义的委托具有相同的签名,因此您无需在定义委托时显式指定参数。

所有这些变体都可以正常调用,并会给出相同的输出。

p1("Hello World");

注意其他答案,其中参数未用于定义匿名方法您不能在匿名方法中使用参数的传递值,这不是声明委托主体的理想方式。