Nullable-Typ GetType () gibt Ausnahme aus

9

Ich habe gerade dieses Quiz von einem Kollegen bekommen, der mich verrückt macht. Für diesen Codeschnipsel:

%Vor%

Warum ist der erste Teil .ToString () funktioniert ohne eine Ausnahme zu werfen und dann den Anruf an GetType () wirft eine Nullreferenceexception?

    
kabaros 04.10.2012, 10:49
quelle

1 Antwort

18

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, um E in den Typ object zu konvertieren, und E wird berücksichtigt in den folgenden Schritten vom Typ object sein. In diesem Fall könnte M nur ein Mitglied von System.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.)

    
Jon Skeet 04.10.2012, 10:50
quelle

Tags und Links