gpt4 book ai didi

c# - Lambda 在 Roslyn 中被视为封闭代表

转载 作者:太空狗 更新时间:2023-10-29 23:21:24 25 4
gpt4 key购买 nike

令我惊讶的是,这两个委托(delegate)(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;

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

为什么没有闭包的 lambda 在 C# 中被视为闭包委托(delegate)(即实例方法)?我想也许是调试器添加了一些东西,但它也发生在发布版本中。

(澄清)

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

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>;
}

它在 Roslyn 中不再起作用,因为“实例”lambda 变得与委托(delegate)签名不兼容。所以我不得不改用 static 方法,没什么大不了的。

但让我担心的是,这在编译时是不可能捕捉到的。 This thread describes similar issues, btw, now that I searched for "Roslyn delegates" .

最佳答案

这是一个 change made to Roslyn in 2014 .这很奇怪,但实际上是为了提高性能。 “在新策略中,所有 lambda 都作为实例方法发出” - 来自 discussion at roslyn.codeplex.com (注意:无效链接)。

关于c# - Lambda 在 Roslyn 中被视为封闭代表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com