繁体   English   中英

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

[英]Anonymous method in static class is non-static? How to invoke it?

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

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,在另一台机器上打印“true”,在.NET Framework 4.6.2和Visual Studio 2015上打印“false”。

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

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

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

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

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

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

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

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

我不确定这有关系吗? 当然你可以通过简单地运行lambda函数(例如)

Console.Print(lambda());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM