Habiendo leído esta pregunta en HNQ, seguí leyendo sobre los tipos de referencia anulables en C # 8 , e hice algunos experimentos.
Soy muy consciente de que 9 de cada 10 veces, o incluso más a menudo, cuando alguien dice "¡Encontré un error del compilador!" esto es en realidad por diseño y su propio malentendido. Y desde que comencé a analizar esta característica solo hoy, claramente no la entiendo muy bien. Con esto fuera del camino, veamos este código:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
Después de leer la documentación que he vinculado anteriormente, esperaría que s == null
línea me avisara, después de todo s
es claramente no anulable, por lo que compararlo null
no tiene sentido.
En cambio, recibo una advertencia en la siguiente línea, y la advertencia dice que s
es posible una referencia nula, aunque, para un humano, es obvio que no lo es.
Además, la advertencia no se muestra si no nos comparamos s
con null
.
Busqué en Google y me encontré con un problema de GitHub , que resultó ser sobre algo completamente diferente, pero en el proceso tuve una conversación con un colaborador que me dio más información sobre este comportamiento (por ejemplo, "Las comprobaciones nulas son a menudo una forma útil de decirle al compilador que restablezca su inferencia previa sobre la nulabilidad de una variable " . Sin embargo, esto todavía me dejó con la pregunta principal sin respuesta.
En lugar de crear un nuevo problema de GitHub, y potencialmente tomar el tiempo de los contribuyentes del proyecto increíblemente ocupados, lo estoy exponiendo a la comunidad.
¿Podría explicarme qué está pasando y por qué? En particular, ¿por qué no se generan advertencias en la s == null
línea y por qué las tenemos CS8602
cuando no parece que una null
referencia sea posible aquí? Si la inferencia de nulabilidad no es a prueba de balas, como sugiere el hilo de GitHub vinculado, ¿cómo puede salir mal? ¿Cuáles serían algunos ejemplos de eso?
?
porque s
no es anulable. No se anula, simplemente porque fuimos lo suficientemente tontos como para compararlo null
.