C# Lambda在Roslyn被视为封闭的代表

C# Lambda在Roslyn被视为封闭的代表,c#,lambda,visual-studio-2015,closures,C#,Lambda,Visual Studio 2015,Closures,我很惊讶这两个代理(fn1和fn2)在运行时会有任何差异: 它不再在Roslyn中工作,因为“实例”lambda与委托签名不兼容。所以我不得不使用静态方法,这没什么大不了的 但让我担心的是,这在编译时是不可能捕捉到的 这是一次失败。这很奇怪,但实际上这样做是为了提高性能。“在新策略中,所有lambda都作为实例方法发出”-来自(注意:死链接)。有趣的是,这是今天关于这个的第二篇帖子-@Ivan:谢谢你的链接,是的,我想这已经改变了,但我没有带VS2012去检查。我很确定这在VS2012中起到了不

我很惊讶这两个代理(
fn1
fn2
)在运行时会有任何差异:

它不再在Roslyn中工作,因为“实例”lambda与委托签名不兼容。所以我不得不使用
静态
方法,这没什么大不了的


但让我担心的是,这在编译时是不可能捕捉到的

这是一次失败。这很奇怪,但实际上这样做是为了提高性能。“在新策略中,所有lambda都作为实例方法发出”-来自(注意:死链接)。

有趣的是,这是今天关于这个的第二篇帖子-@Ivan:谢谢你的链接,是的,我想这已经改变了,但我没有带VS2012去检查。我很确定这在VS2012中起到了不同的作用,因此它看起来像是Visual Studio 2015中的一个突破性变化(尽管我不明白为什么,因为我在VS2012和现在的2015中都是以.NET 4.5.2为基础构建的,所以我认为这是框架版本的问题).看来目标框架并不重要-变化显然源自Roslyn。毕竟,这是一个编译器特性,我想不是框架,因为这个方法是静态的。使其非静态,您将看到
Func fn1=new Program()。一些非静态方法
@M.kazemAkhgary:是的,但我认为
x=>x
也应该被视为静态的。如果没有其他原因,出于性能原因,因为如果主体内没有闭包,则无需使用“this call”。谢谢,这就解释了这一点。我想知道是否有这些变化的完整列表。据我所知,除了Codeplex和Github等地方的bug报告讨论之外,其他地方都没有列出这些变化。我认为他们不会宣布这样的更改,因为规范中没有对行为进行任何定义。应该对其进行定义,尽管您的示例表明它会破坏工作代码。我搜索了一些之后发现,它可能不是完全最新的,但似乎是应该列出这些内容的地方。
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;
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>;
}