2017-02-21 107 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 ()'的調用,但不包含那些不存在的早期框架版本。 –

相關問題