2016-07-15 9 views
-2

Ich bin ein wenig überrascht, dass der Konstruktor ruft in:A Standard (T) Enum-Wert nicht gleich null

class MyClass<T> 
{ 
    public MyClass() 
    { 
     if (default(T) == null) 
      Debugger.Break(); 
    } 
} 

nicht bricht, wenn T ist ein Aufzählungstyp. Warum? Es scheint, dass selbst für Enums default(T) und null gleichwertig sein sollten.

+0

Warum? Irgendein Link zu einer Dokumentation, die Sie glauben gemacht hat? (Sie können http://stackoverflow.com/questions/65351/null-or-default-comparison-of-generic-argument-in-c-sharp lesen, wenn Sie Parameter mit "null" vergleichen müssen) –

+0

Siehe http://stackoverflow.com/questions/4967656/what-is-the-default-value-for-enum-variable – seairth

+0

Resharper sollte Ihnen die Warnung gegeben haben. –

Antwort

2

Kein Wert Typ wird sich immer als gleich null zu testen, es sei denn, es Nullable<T> ist, die speziellen Compiler und Sprachunterstützung hat einen ungesetzt Wert als null zu behandeln.

Die default(T), wobei T ist ein beliebiger Werttyp, einschließlich einer Enumeration, wird sein, was auch immer der 0-gefüllte Wert für diesen Typ ist. I.e. ein tatsächlicher Wert. Nicht null.


Zusätzlicher Lesestoff: How to set enum to null
What does default(object); do in C#?

Sie können auch einige der anderen Treffer in dieser Suche zu lesen: [c#] default value enum null

+0

Rechts. Aus diesem Grund wurde das Schlüsselwort 'default' in C# eingeführt. Ich finde es nur etwas unintuitiv, dass ein "0-gefüllter Wert" anders ist als "null". Also war der Grund nicht sofort offensichtlich. – HappyNomad

+0

_ "Deshalb wurde das Standardschlüsselwort in C# eingeführt, um mit" _ zu beginnen - Eigentlich wurde diese _usage_ des Schlüsselwortes 'default' (es gab immer' default' in einer 'switch' Anweisung) eingeführt, um generischen Code zu unterstützen benötigt, um immer einen Standardwert erstellen zu können, ohne den tatsächlichen Typ zu kennen. Dass dies der 0-gefüllte Wert ist, ist ebenso eine Frage von Bequemlichkeit und Effizienz wie alles andere. In ähnlicher Weise ist diese "Null" intern als "0" dargestellt, eine Frage der Bequemlichkeit; 'null' ist ein spezieller Wert, der nur bei Referenztypen Bedeutung hat. –

+0

"'null' ist ein spezieller Wert, der nur bei Referenztypen Bedeutung hat" - genau das finde ich nicht intuitiv. Bei näherer Betrachtung ist der Unterschied jedoch offensichtlich. Während der Standardwert eines Wertetyps immer noch ein tatsächlicher Wert ist, ist der Standardwert eines Referenztyps ("null") das * Fehlen * eines Wertes. – HappyNomad

1

Da ENUM in .net ein Werttyp ist. Wenn Sie nur herausfinden wollen, ob default(T) == null, dann können Sie stattdessen überprüfen, ob es sich um einen Referenztyp handelt.

class MyClass<T> 
{ 
    public MyClass() 
    { 
     if (typeof (T).IsClass) 
     { 
      Debugger.Break(); 
     } 
     else if (typeof (T).IsValueType) 
     { 
      //do something 
     } 
    } 
} 
+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/13012680) –

+1

@EdvinTenovim Antwort aktualisiert. –

+0

Antwort wurde aktualisiert. Kann jemand die Abstimmung ablehnen? –