Wenn ich rufe 0 an Wert übergeben: SaveOrRemove("MyKey", 0)
, die Bedingung value == null
ist falsch, dann CLR nicht value == default(T)
. Was passiert wirklich?
Der JIT-Compiler entfernt grundsätzlich alle Vergleiche mit null, wenn T ein nicht nullbarer Wertetyp ist, wobei angenommen wird, dass alle falsch sind. (Nurable-Werttypen werden mit dem Nullwert für diesen Typ verglichen, was wahrscheinlich zu erwarten ist.)
Wenn Sie möchten, dass es mit dem Standardwert vergleicht, könnten Sie Folgendes verwenden:
%Vor%Ihre Frage wird in Abschnitt 7.9.6 der C # -Spezifikation beantwortet:
Wenn ein Operand eines Typparameters type T wird mit null und der Laufzeit verglichen Typ von T ist ein Werttyp, das Ergebnis der Vergleich ist falsch.
Wenn du default(T)
willst, musst du es sagen, nicht null
, was eine eigene Bedeutung hat. Wenn Sie die Möglichkeit haben möchten, anstelle eines Wertetyps ein null
zu übergeben, sollten Sie stattdessen Nullable<T>
verwenden.
Also würde Ihr Code:
werden %Vor% Beachten Sie, dass Nullable<T>
nur bei Werttypen nützlich ist (Structs, "Builtins" außer String); Für Referenztypen können Sie sie trotzdem nicht verwenden.