Nullable ist kein ValueType

8

Wenn Sie sich die Dokumentation für .NET Nullable anschauen, sehen Sie:

%Vor%

Beachten Sie, dass es sich um eine Struktur und keine Klasse handelt.

Es scheint ein struct Nullable<T> ist nicht ein ValueType, was sehr unerwartet ist. Der folgende Code gibt False aus:

%Vor%

Wenn Sie sich die generierte IL ansehen, sehen Sie, dass der Compiler bei der Kompilierung nullableType als ValueType festgelegt hat. Aber wie kann es ein ValueType sein, wenn es eine Struktur ist? Alle Strukturen sind ValueTypes, oder? Offensichtlich hat es etwas mit dem Generischen zu tun.

Was fehlt mir hier? Gibt es etwas in der Sprachspezifikation dazu?

Danke.

    
Tom Baxter 13.07.2011, 03:56
quelle

3 Antworten

15

Sie testen, ob System.Type ein Werttyp ist. Es ist nicht. Schreibe es so um:

%Vor%     
Hans Passant 13.07.2011 04:05
quelle
12

Es ist ein Werttyp, versuchen Sie es so:

%Vor%

Das sollte wahr werden. Hoffe das hilft.

    
rsbarro 13.07.2011 04:06
quelle
2

Nullable<T> ist eine generische Familie von Typen, die den Regeln weder von Werttypen noch von Klassentypen entsprechen. Laufzeitmethoden zum Überprüfen des Objekttyps erfordern Boxen. Wenn die HasValue -Eigenschaft von Nullable<T> true ist, wird ein Versuch, sie zu boxen, in ein T zerlegt und diese Box mit einem Kasten versehen. Andernfalls wird ein Versuch, es zu boxen, null ergeben. In keinem Fall wird es als Nullable<T> geboxt. Es ist möglich, ein Type-Objekt für Nullable<T> zu konstruieren, und das IsValueType eines solchen Type -Objekts gibt true zurück, und die Analyse der Speichernutzung bestätigt, dass ein Nullable<T> als Werttyp gespeichert ist, aber Da es einige Regeln außer Kraft setzt, die für alle anderen Werttypen gelten, werden 'Nullable<T> am besten als eine einzigartige Art von Entität angesehen.

    
supercat 26.07.2011 17:26
quelle

Tags und Links