Esta pregunta fue el tema de mi blog el 30 de mayo de 2013 . Gracias por la gran pregunta!
Estás mirando una entrada vacía.
Alguien le pregunta "¿puede su camino de entrada sostener un Honda Civic?"
Si. Sí puede.
Alguien te señala un segundo camino de entrada. También está vacío. Preguntan "¿Puede el contenido actual de mi entrada encajar en su entrada?"
Si obviamente. ¡Ambas entradas están vacías! Entonces, claramente, el contenido de uno puede caber en el otro, porque no hay contenido de ninguno de ellos en primer lugar.
Alguien le pregunta "¿Su entrada contiene un Honda Civic?"
No, no lo hace.
Estás pensando que el isoperador responde la segunda pregunta: dado este valor, ¿cabe en una variable de ese tipo? ¿Una referencia nula cabe en una variable de este tipo? Si lo hace
Esa no es la pregunta que responde el isoperador. La pregunta que responde el isoperador es la tercera pregunta. y is Xno pregunta "¿ es yun valor legal de una variable de tipo X? " Pregunta " ¿Es yuna referencia válida a un objeto de tipo X? " Dado que una referencia nula no es una referencia válida a ningún objeto de ningún tipo, la respuesta es "no ". Esa entrada está vacía; No contiene un Honda Civic.
Otra forma de verlo es que y is Xresponde la pregunta "si dijera y as X, ¿obtendría un resultado no nulo? Si y es nulo, ¡claramente la respuesta es no!
Para profundizar un poco en su pregunta:
Uno espera que el valor nulo pertenezca a cualquier tipo de referencia (o anulable)
Uno supondría implícitamente que un tipo es un conjunto de valores , y que la compatibilidad de asignación de un valor y con una variable de tipo X no es más ni menos que verificar si y es miembro del conjunto x .
Aunque esa es una forma extremadamente común de ver los tipos, no es la única forma de ver los tipos, y no es la forma en que C # mira los tipos. Las referencias nulas son miembros de ningún tipo en C #; la compatibilidad de asignaciones no es simplemente verificar un conjunto para ver si contiene un valor. El hecho de que una referencia nula sea una asignación compatible con una variable de tipo de referencia X no significa que nulo sea miembro del tipo X. La relación "es una asignación compatible con" y la relación "es un miembro del tipo" obviamente tiene muchas se superponen, pero no son idénticos en el CLR.
Si le interesan las reflexiones sobre la teoría de tipos, consulte mis artículos recientes sobre el tema:
¿Qué es esta cosa que llamas un "tipo"? Parte uno
¿Qué es esta cosa que llamas un "tipo"? La segunda parte