Was CLR macht, wenn man T mit null vergleicht und T eine Struktur ist?

8
%Vor%

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?

    
Felipe Fujiy Pessoto 19.03.2010, 11:20
quelle

3 Antworten

10

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%     
Jon Skeet 19.03.2010, 11:22
quelle
5

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.

    
Eric Lippert 19.03.2010 15:50
quelle
0

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.

MSDN-Verknüpfung

    
Chris Charabaruk 19.03.2010 12:40
quelle

Tags und Links