Lambda在Visual Studio 2015中被视为已关闭的委托

Gro*_*roo 5 c# lambda closures visual-studio-2015

我很惊讶这两个委托(fn1fn2)之间会有任何运行时差异:

static int SomeStaticMethod(int x) { return x; }

// fn1.Target == null in this case
Func<int, int> fn1 = SomeStaticMethod;

// fn2.Target != null in this case
Func<int, int> fn2 = x => x;
Run Code Online (Sandbox Code Playgroud)

但显然第二个lambda被视为实例方法,因为它的Target属性是非null.在我切换到Visual Studio 2015之前,它的处理方式不同(在VS2012中,我很确定它被视为静态方法).

是否有理由将没有闭包的lambda视为C#中的闭合委托(即实例方法)?我想也许这是调试器添加一些东西,但它也发生在发布版本中.

(澄清)

关键是,我有一个这样的方法,它创建了一个通用委托,用于快速从枚举转换为int(无需装箱):

private static Func<int, TEnum> CreateIntToEnumDelegate()
{
    Func<int, int> lambda = x => x;
    return Delegate.CreateDelegate(typeof(Func<int, TEnum>), lambda.Method) 
        as Func<int, TEnum>;
}
Run Code Online (Sandbox Code Playgroud)

它不再适用于Roslyn,因为"实例"lambda与委托签名不兼容.所以我不得不使用一种static方法,没什么大不了的.

但令我担心的是,这在编译期间无法捕获.这个帖子描述了类似的问题,顺便说一句,现在我搜索了"Roslyn代表".

Gal*_*lax 4

这是2014 年 Roslyn 做出的改变。这很奇怪,但实际上是为了提高性能。“在新策略中,所有 lambda 都作为实例方法发出” - 来自roslyn.codeplex.com 的讨论(注意:死链接)。