2017-02-21 6 views
1

Mein Team ist gerade dabei, eine Anwendung von targeting .NET 4.0 auf 4.6.2 zu aktualisieren. Ja, spät zu den Party (s), aber besser spät als nie.Expression Body Unterschiede zwischen .NET 4 und .NET 4.6.2

In unserer Anwendung gibt es eine Erweiterungsmethode, die die MethodInfo der zurückgegebenen Methode aus einem Ausdruck zurückgibt. Mit anderen Worten, wenn wir haben:

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

und dann hatten einen Ausdruck

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

dann unsere Erweiterungsmethode die Method des Verfahrens DoSomething()

Der Code funktionierte großartig in zurückkehren würde .NET 4.0, funktioniert aber nicht in .NET 4.6.2. Ich habe seitdem den Code geändert, um zu arbeiten, aber meine Frage ist, weiß jemand, wo in den Release Notes von .NET 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1 und 4.6.2 dies dokumentiert wäre? Ich habe sie mehrere Male ohne etwas gelesen und durchsucht.

Dies sind die Release Notes Ich habe mir durch:

Wenn Sie die lokalen Variablen zu vergleichen, beim Debuggen, können Sie sehen, wie die Methodenrümpfe der Ausdrücke unterscheiden zwischen .NET 4.0 und 4.6.2:

.NET 4.0: enter image description here

.NET 4.6.2: enter image description here

Ich bin mir bewusst, dass .NET eine Methode eingeführt hat, die dies tut; Ich bin interessiert, wo die Veränderung dokumentiert ist, im Gegensatz zu der Lösung (die ich bereits habe).

Vielen Dank im Voraus für unsere Hilfe!

+0

Ja, weil Sie in Ihrem Beispiel einen Delegaten verwenden und die API für den Zugriff geändert hat.Es gibt eine Frage dazu hier irgendwo in meinen Favoriten, aber ich bin auf meinem Handy. Aber Sie könnten es in Ausdruck > x = f => f.DoSomething(); 'ändern und so auf die MethodInfo zugreifen (was besser sein sollte). – pinkfloydx33

+0

Eine der Antworten hier sollte helfen, obwohl Sie es versuchen sollten ein 'Ausdruck >' und nicht 'Ausdruck >' http://stackoverflow.com/a/26976055/491907 Sie versuchen, eine Methodengruppe zu verwenden, die im Wesentlichen ein Delegat ist, und Sie müssen etwas extra "auspacken" "um zur Methode zu kommen – pinkfloydx33

+0

Auch um Ihre Frage zur Dokumentation spezifisch zu beantworten, kam die Änderung in 4.5 zustande, aber ich bezweifle, dass dies ausdrücklich als eine Art Missbrauch des Systems dokumentiert wurde. Wenn überhaupt, würden Sie es in Bezug auf 'Delegate's oder' MethodInfo.CreateDelegate' finden, wofür es geändert wurde. – pinkfloydx33

Antwort

3

Die MethodInfo.CreateDelegate() Methode, die der Compiler anstelle von Delegate.CreateDelegate() verwendet wurde mit .NET 4.5

Die dokumentierten Verhalten des der C# Expression eingeführt

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

ist, dass sie einen Ausdruck erzeugen eine Func<Foo, Action> repräsentiere dass, wenn kompiliert und aufgerufen wird ein Foo nehmen und einen Action zurückgeben, der .DoSomething() auf diesem Foo aufruft. Dieses Verhalten hat sich nicht geändert. Da sich das dokumentierte Verhalten nicht geändert hat, ist die Änderung wahrscheinlich nicht dokumentiert. (Solche Änderungen werden dokumentiert, wenn bekannt ist, dass sie Probleme verursachen, aber nicht immer).

+0

Es ist also keine Änderung in .NET, es wird anders kompiliert? Wir verwendeten .NET 4 mit VS2015 und jetzt ist es .NET 4.6.2 auch mit VS2015. Wäre der Compiler nicht derselbe? – pdalbe01

+0

Der Compiler ist derselbe, aber es kann 'MethodInfo.CreateDelegate()' nicht verwenden, wenn es mit einem früheren Framework kompiliert wird, da es nicht existiert. Vergleichen Sie mit, wie mit 4.6 ein Aufruf einer 'params'-Methode mit leeren' params' als Aufruf von 'Array.Empty ()' kompiliert wird, nicht jedoch bei früheren Framework-Versionen, wo diese nicht existieren. –

Verwandte Themen