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
%Vor%Wert1: 0, Wert2: 10
Wert1: 10, Wert2: 25
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.
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:
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.
Tags und Links c# arguments async-await parameters parameter-passing