为什么lambdas可以转换为表达式而方法组不是?

Tru*_*ill 10 c# lambda c#-4.0

LINQPad示例:

void Main()
{
    One(i => PrintInteger(i));
    One(PrintInteger);

    Two(i => PrintInteger(i));
    // Two(PrintInteger); - won't compile
}

static void One(Action<int> a)
{
    a(1);
}

static void Two(Expression<Action<int>> e)
{
    e.Compile()(2);
}

static void PrintInteger(int i)
{
    Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

取消注释该Two(PrintInteger);行会导致错误:

无法从'方法组'转换为'System.Linq.Expressions.Expression <System.Action <int >>'

这类似于将方法组转换为表达式,但我对"为什么"感兴趣.我知道功能需要花费金钱,时间和精力 ; 我想知道是否有更有趣的解释.

Kon*_*lph 8

因为,为了获得表达式树,我们需要在(未编译的)表单中表示该方法.Lambda表达式在源代码中是本地可用的,因此始终可以不编译.但是方法可能不是来自当前程序集内部,因此可能只能以编译形式提供.

当然,C#编译器可以反编译程序集的IL代码以检索表达式树,但正如您所提到的,实现功能需要花钱,这个特殊功能并不简单,而且好处不明确.