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

时间:2017-02-22 11:40:30

标签: c# .net reflection lambda

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

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

在安装了.NET 4.5和Visual Studio 2012的一台计算机上,这打印&#34; true&#34;,在另一台计算机上,使用.NET Framework 4.6.2和Visual Studio 2015打印&#34; false&# 34。

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

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

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

2 个答案:

答案 0 :(得分:9)

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

我无法给出一个明确的理由说明为什么会在这里进行具体更改(尽管我知道已经进行了一些更改以使Edit-and-Continue能够在更多上下文中工作),但它从来都不是合同< / em>关于lambda如何实现。

  

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

好吧,lambda是一个Delegate,并且它总是暴露一个Target属性,该属性在代理绑定时引用一个实例。

答案 1 :(得分:0)

  

我如何获得这样的实例

我不确定这是否重要?当然,您可以通过简单地执行此操作来运行lambda函数(例如)

Console.Print(lambda());

因此它是静态的事实在很大程度上是无关紧要的。