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

标签 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 引入了执行此操作的方法;我感兴趣的是更改记录在何处,而不是解决方案(我已经有了)。

预先感谢我们的帮助!

最佳答案

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

C# 表达式的记录行为

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

是它将创建一个表示 Func<Foo, Action> 的表达式如果编译和调用将采用 Foo并返回 Action那叫.DoSomething()在那Foo .这种行为没有改变。由于记录的行为没有变化,所以很可能没有关于变化的文件。 (如果已知此类更改会导致问题,则会记录此类更改,但并非总是如此)。

关于c# - .NET 4 和 .NET 4.6.2 之间的表达式主体差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378107/

相关文章:

C# OpenXml Excel Creation - 我可以将它设置为 "Format as table"吗?

c# - OData $select 不适用于 Web API

C++ lambda自传递异常

c++ - 哪些标识符可用于构造函数初始化列表中的 lambda

java - 如何使用java从XML读取父节点的子节点

parameters - 如何将谓词作为参数传递给 Prolog 中的另一个谓词?

c# - 我应该使用哪一个? decimal.Add() 或 "+"

c# - 使用大写和小写标记解析 HTML Agility Pack?

VS 2013 中的 C++ 11 lambda 回调无法编译

c# - 如何等待以特定 linq 表达式作为参数的调用