Gro*_*roo 5 c# lambda closures visual-studio-2015
我很惊讶这两个委托(fn1和fn2)之间会有任何运行时差异:
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代表".
这是2014 年 Roslyn 做出的改变。这很奇怪,但实际上是为了提高性能。“在新策略中,所有 lambda 都作为实例方法发出” - 来自roslyn.codeplex.com 的讨论(注意:死链接)。
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |