ToString
wird in Nullable<T>
überschrieben, sodass kein Boxing erforderlich ist der Anruf.
GetType()
ist keine virtuelle Methode, wird also nicht überschrieben (und kann nicht überschrieben werden), daher wird der Wert eingerahmt, bevor der Aufruf ausgeführt wird ... und das Eingeben eines Nullwerts eines Nullwerttyps ergibt eine Nullreferenz.
Der Grund für das Boxen ist in Abschnitt 7.5.5 der C # 4-Spezifikation:
Wenn
M
ein Instanzfunktionsmember ist, der in einem Referenztyp deklariert ist:
- ...
- Wenn der Typ von
E
ein Werttyp ist, wird eine Boxkonvertierung (4.3.1) durchgeführt, umE
in den Typobject
zu konvertieren, undE
wird berücksichtigt in den folgenden Schritten vom Typobject
sein. In diesem Fall könnteM
nur ein Mitglied vonSystem.Object
sein.
Beachten Sie, dass wenn Sie hatten:
%Vor% Am Ende wird der Typ mit typeof(int)
identisch sein, ebenfalls aufgrund des Boxens. Es ist nicht möglich, einen Wert foo
zu erstellen, sodass foo.GetType()
einen Nullwerttyp mit der normalen Methode GetType()
zurückgibt. (Sie könnten natürlich eine neue GetType()
-Methode erstellen, aber das ist ein Nebenproblem:)
(Die Verwendung von "Bang!" deutet darauf hin, dass der Autor des besagten Quiz ich selbst sein könnte. Entschuldigung dafür, dass Sie verrückt werden, wenn das der Fall ist.)