静态类中的匿名方法是非静态的?如何调用它?

Jen*_*ens 9 .net c# reflection lambda

我在两台不同的机器上运行以下程序:

static class Program
{
    static void Main(string[] args)
    {
        Func<int> lambda = () => 5;
        Console.WriteLine(lambda.GetMethodInfo().IsStatic);
        Console.ReadLine();
    }        
}
Run Code Online (Sandbox Code Playgroud)

在一台计算机上,安装了.NET 4.5和Visual Studio 2012,在另一台机器上打印"true",在.NET Framework 4.6.2和Visual Studio 2015上打印"false".

我认为匿名方法是静态的,如果它们是在静态上下文中定义的.在最后一些框架更新期间,这是否有所改变(以文档的方式)?

我需要做的是使用Expression.Callon lambda.GetMethodInfo(),在非静态的情况下,这需要一个定义lambda的实例.如果我想使用lambda.GetMethodInfo().Invoke我会遇到同样的问题.

我怎么能得到这样的实例?

Dam*_*ver 9

请记住,这(lambdas)是一个编译器功能,因此运行时框架版本不会有所作为.此外,因为这是一个编译器功能,所以2012年和2015年之间存在差异(引入Roslyn时替换了大多数现有的编译器基础结构)并不奇怪.

我不能给出一个可靠的理由来解释为什么它会在这里被特别改变(虽然我知道已经进行了一些改变以使Edit-and-Continue能够在更多的上下文中工作),但它从来没有关于如何实现lambdas的合同.

我怎么能得到这样的实例?

好吧,lambda是一个Delegate,并且它总是暴露一个Target属性,当委托如此绑定时引用一个实例.