2017-02-21 114 views
1

我的团队正在将从.NET 4.0定位到4.6.2的应用程序升级。是的,晚会晚了,但比从未晚。.NET 4和.NET 4.6.2之间的表达体差异

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

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

,然后有一个表达

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

那么我们的扩展方法将返回方法的MethodInfo的DoSomething的()

中的代码工作很大.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引入了这样的方法;我对变更记录的位置感兴趣,而不是解决方案(我已经拥有)。

在此先感谢您的帮助!

+0

是的,因为在你的例子中你正在使用一个委托,并改变了如何访问它们的api。这里有一个关于我最喜欢的地方的问题,但我正在用手机。但你可以将它改为'Expression > x = f => f.DoSomething();并以这种方式访问​​MethodInfo(这应该是更好的) – pinkfloydx33

+0

这里的答案之一应该有所帮助,尽管你应该尝试这样做一个'Expression >''而不是'Expression >'http://stackoverflow.com/a/26976055/491907您正在尝试使用一个基本上是委托的方法组,并且您必须执行一些额外的“解包“以获得方法 – pinkfloydx33

+0

也为了具体回答你关于文档的问题,这个变化在4.5版本中出现了,但我怀疑这被明确记录为它对系统的滥用。如果有任何事情你会发现它与'Delegate's或者'MethodInfo.CreateDelegate'有关,它就是它被改为使用 – pinkfloydx33

回答

3

MethodInfo.CreateDelegate()方法,编译器使用的Delegate.CreateDelegate()代替用.NET 4.5

的C#的表达

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

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

+0

所以这不是.NET中的变化,它的编译方式不同吗?我们在VS2015上使用.NET 4,现在也是在VS2015上使用.NET 4.6.2。编译器不会是一样的吗? – pdalbe01

+0

编译器是相同的,但如果它是针对较早的框架编译的话,它不能使用'MethodInfo.CreateDelegate()',因为它不存在。与4.6相比,对具有空“params”的'params'方法的调用被编译为对'Array.Empty ()'的调用,但不包含那些不存在的早期框架版本。 –

相关问题