Den Null-Koaleszenzoperator verstehen (??)

8

Ich habe eine benutzerdefinierte WebControl , die eine .Value getter / setter implementiert, die eine Nullable & lt; dezimal & gt;

zurückgibt

Es ist eine clientseitige gefilterte Textbox (eine Unterklasse von TextBox mit eingeschlossenem Javascript und einige serverseitige Logik zum Setzen / Abrufen des Wertes)

Hier ist der Getter & Amp; der Setter von diesem Steuerelement:

%Vor%

Das Problem, das ich sehe, ist die Ausgabe dieser Anweisung:

%Vor%

Ich sehe, dass Betrag auf "0" gesetzt wird, wenn uxAmount.Value 10000 zurückgibt.

Das hat so funktioniert, wie ich es erwartet hatte (entschuldigen Sie die Änderung im Gehäuse):

%Vor%

Ich habe dieses Verhalten (kürzlich) auch beim Aufruf einer UDF-Funktion in einem Linq2Sql-Datenkontext zusammen mit dem Null-Koaleszenzoperator gesehen, dh ich wusste, dass mein UDF-Aufruf den erwarteten Wert zurückgegeben hat, aber ich stattdessen den RHS-Wert erhielt.

Noch verwirrender, wenn ich uxAmount.Value in der Uhr auswerte, bekomme ich 10000 vom Typ Nullable<decimal> .

Hier sind einige Ausdrücke, die ich ausprobiert habe:

%Vor%

Dann habe ich diesen Ausdruck nach den obigen 4

hinzugefügt %Vor%

Jetzt

%Vor%

Es scheint, als ob der letzte Aufruf immer 0 ist, aber der Wert von uxAmount.Value (der aus .Text wie oben beschrieben get / setter mit TryParse analysiert wird, ist stabil. Ich wurde an einem Haltepunkt angehalten und es gibt keine anderen Threads, die diesen Wert manipulieren könnten.

Beachten Sie die Verwendung des M-Suffixes, um die Konstante zu dezimieren, da sie ganzzahlig war und ich ein Typkonvertierungsproblem vermutete.

Irgendwelche Ideen?

Der Wert von LHS und RHS scheint stabil und bekannt zu sein.

- bearbeiten - einige Screengrabs von VS2010

    
agrath 14.08.2012, 21:06
quelle

2 Antworten

0

(Diese Antwort wurde aus meinen obigen Kommentaren erstellt.)

Bist du sicher, dass der Debugger dir das korrekt anzeigt? Haben Sie versucht, einige Zeilen weiter nach unten zu verschieben, um sicherzustellen, dass Sie den aktualisierten Wert von amount3 ?

haben?

Ich bin sicher, dass es nur ein Problem mit dem Debugger ist. Manchmal muss man etwas weiter gehen. Vielleicht hat der übersetzte Code (IL) einige Optimierungen, die den Debugger verwirren (oder was würde ich wissen). Aber ohne den Debugger wird der Wert genau dann aktualisiert, wenn Sie es erwarten.

Ich habe gesehen, dass andere erfahrene Entwickler durch ähnliche Situationen verwirrt sind. Daher weiß ich, dass der Debugger manchmal "eine Zeile Code" hinter sich hat, wenn er sich eine Zuweisung zu einer lokalen Variablen ansieht. Vielleicht kann jemand einen Link finden, der das diskutiert?

    
Jeppe Stig Nielsen 14.08.2012, 21:51
quelle
1

Sehen Sie sich diese ähnliche Frage an

Verwendung des Koaleszenz-Nulloperators on NULL-fähige Typen ändern den impliziten Typ

warum nicht einfach

%Vor%

Dies ist nicht die richtige Antwort auf die Probleme der Originalplakate bei den letzten Änderungen und Kommentaren.

    
Christensen Solutions 14.08.2012 21:43
quelle