Piénselo de esta manera, el compilador no le dice que arrojará una referencia nula y, por lo tanto, no puede compilar, sino que no se cumple una de las condiciones que se requieren para la compilación. es decir, que debe asignarse definitivamente.
De acuerdo con la hipótesis nula spec es AC# literal: "El null-literal se puede convertir implícitamente a un tipo de referencia o tipo anulable"
Así como en términos de asignaciones: (tomada de la especificación)
de inicio de la cita tomada de la especificación
5.3.3 normas precisas para determinar la asignación definitiva con el fin de determinar que cada variable utilizada se asignaron claramente, el compilador debe usar un proceso que sea equivalente al descrito en esta sección.
El compilador procesa el cuerpo de cada miembro de la función que tiene una o más variables inicialmente no asignadas. Para cada variable v inicialmente sin asignar, el compilador determina un estado de asignación definitiva para v en cada uno de los siguientes puntos en el elemento de función:
· Al comienzo de cada declaración
· En el punto final (§ 8.1) de cada declaración
· en cada arco que transfiere el control a otro estado de cuenta o al punto final de una instrucción
· al comienzo de cada expresión
· en Al final de cada expresión
Fin de la cita
Así que, aunque no válida no está realmente apuntando a un objeto en la memoria, no cumple con los requisitos de ser definitivamente asignado y es por eso que el compilador lo permite.
Hmm, eso es interesante, creo que ha de ser a pesar de que este código (segunda versión) seguiría siendo una excepción en tiempo de ejecución .. lo más probable es sólo una cuestión de Visual Studio que no está recogiendo la asignación nula - Justo una adivinanza ? –
Eche un vistazo a http://stackoverflow.com/questions/4770426/non-initialized-vs-null-values-of-reference-types – Haplo
muy agradable y elegante pregunta – user1451111