Warum beeinflusst die Verwendung des hawward-Operators für das zweite Argument einer Methode den Wert des ersten Arguments?

8

Das folgende C # -Programm erzeugt eine unerwartete Ausgabe. Ich würde erwarten zu sehen:

  

Wert1: 25, Wert2: 10

     

Wert1: 10, Wert2: 25

aber stattdessen sehe ich

  

Wert1: 0, Wert2: 10

     

Wert1: 10, Wert2: 25

%Vor%

Kann mir jemand erklären, warum es so aussieht, dass die Verwendung des Operators "gonna" im Ausdruck für das zweite Argument der Methode PrintTwoValues den Wert des ersten Arguments beeinflusst?

Meine Vermutung ist, dass es etwas damit zu tun haben muss, dass die Argumentliste von links nach rechts ausgewertet wird. Beim ersten Aufruf von PrintTwoValues gehe ich davon aus, dass der Rückgabewert von SomeClass.MyValue auf den Stack geschoben wird. Dann wird die Ausführung in GetValue fortgesetzt, wodurch die Aufgabe gestartet und beendet wird. Dann beendet DoWork und plant eine Fortsetzung, die PrintTwoValues aufruft, aber wenn diese Fortsetzung ausgeführt wird, ist der Wert, der ursprünglich auf den Stack geschoben wurde, irgendwie verloren und wurde auf den Standardwert zurückgesetzt.

Es gibt zwar einfache Methoden zur Problemumgehung, wie das Speichern der Argumente in temporären Variablen, bevor sie an die PrintTwoValues -Methode übergeben werden, aber ich bin meistens nur neugierig, warum dieses Verhalten auftritt.

Hinweis: Ich verwende Visual Studio 2013, Update 5. Ich erstelle eine Konsolenanwendung, die auf .NET Framework 4.5 abzielt und unter Windows 10 Enterprise ausgeführt wird.

    
supwar 29.09.2015, 23:59
quelle

1 Antwort

5

Ich habe den Code sowohl mit dem C # 5-Compiler als auch mit dem C # 6-Compiler getestet, indem ich verwendet habe LinqPad 4 und LinqPad 5 und ich könnte das Problem reproduzieren.

Das sieht aus wie ein Compiler-Fehler des C # 5-Compilers, denn wenn ich beide Versionen mit . NET Reflektor 9 , ich habe anderen Code:

C # 5:

%Vor%

C # 6:

%Vor%

Beachten Sie, dass für C # 5 die Variable myValue vor der Deklaration von foo deklariert und vor dem ersten Aufruf von PrintTwoValues nicht initialisiert wird.

    
Paulo Morgado 30.09.2015, 20:15
quelle