我在两台不同的机器上运行以下程序:
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
,我会遇到同样的问题。
我怎样才能得到这样的实例?
答案 0 :(得分:9)
请记住,这个(lambdas)是一个编译器功能,因此运行时框架版本不会有所作为。此外,因为这是一个编译器功能,所以2012年和2015年之间存在差异(引入Roslyn时替换了大部分现有的编译器基础结构)并不奇怪。
我无法给出一个明确的理由说明为什么会在这里进行具体更改(尽管我知道已经进行了一些更改以使Edit-and-Continue能够在更多上下文中工作),但它从来都不是合同< / em>关于lambda如何实现。
我怎样才能得到这样的实例?
好吧,lambda
是一个Delegate
,并且它总是暴露一个Target
属性,该属性在代理绑定时引用一个实例。
答案 1 :(得分:0)
我如何获得这样的实例
我不确定这是否重要?当然,您可以通过简单地执行此操作来运行lambda函数(例如)
Console.Print(lambda());
因此它是静态的事实在很大程度上是无关紧要的。