.NET 4和.NET 4.6.2之间的表达式主体差异

时间:2017-02-21 21:14:08

标签: c# lambda expression clr

我的团队正在将应用程序从.NET 4.0升级到4.6.2。是的,迟到了晚会,但迟到总比没有好。

在我们的应用程序中,有一个扩展方法,它从表达式返回返回方法的MethodInfo。换句话说,如果我们有:

public class Foo
{
    public void DoSomething() { }
}

然后有一个表达式

Expression<Func<Foo, Action>> = f => f.DoSomething;

然后我们的扩展方法将返回方法DoSomething()

的MethodInfo

代码在.NET 4.0中运行良好,但在.NET 4.6.2中不起作用。我已经改变了代码工作,但我的问题是有谁知道.NET 4.5,4.5.1,4.5.2,4.6,4.6.1和4.6.2的发行说明中的​​哪些内容会被记录下来?我没有任何东西多次阅读和搜索过他们。

这些是我一直在浏览的发行说明:

在调试时比较局部变量时,可以看到.NET 4.0和4.6.2之间表达式的方法体是如何不同的:

.NET 4.0: enter image description here

.NET 4.6.2: enter image description here

我知道.NET引入了一种方法来实现这一点;我对记录变更的位置感兴趣,而不是解决方案(我已经拥有)。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

.NET 4.5引入了编译器使用的MethodInfo.CreateDelegate()方法而不是Delegate.CreateDelegate()

C#表达式的记录行为

Expression<Func<Foo, Action>> e = f => f.DoSomething;

是它将创建一个表示Func<Foo, Action>的表达式,如果编译和调用将使用Foo并返回Action.DoSomething()就会Foo }}。此行为未更改。由于记录的行为没有变化,因此很可能没有变更的文档。 (如果知道这些变化导致问题,则会记录此类变更,但并非总是如此)。