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:
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.
Sie testen, ob System.Type
ein Werttyp ist. Es ist nicht. Schreibe es so um:
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.