estoy usando int
como un ejemplo, pero esto se aplica a cualquier tipo de valor en .Net.Net 2+: ¿por qué if (1 == null) ya no lanza una excepción de compilador?
En .Net 1 lo siguiente sería lanzar una excepción compilador:
int i = SomeFunctionThatReturnsInt();
if(i == null) //compiler exception here
ahora (en .Net 2 o 3.5) esa excepción se ha ido.
sé por qué esto es:
int? j = null; //nullable int
if(i == j) //this shouldn't throw an exception
El problema es que debido a int?
es anulable y int
tiene ahora una conversión implícita a int?
. La sintaxis anterior es magia de compilador. Realmente lo estamos haciendo:
Nullable<int> j = null; //nullable int
//compiler is smart enough to do this
if((Nullable<int>) i == j)
//and not this
if(i == (int) j)
Así que ahora, cuando hacemos i == null
obtenemos:
if((Nullable<int>) i == null)
Dado que C# compilador está haciendo la lógica para calcular esto de todos modos por qué no puede ser lo suficientemente inteligente como para no hacerlo cuando se trata de valores absolutos como null
?
El compilador detecta correctamente que nunca es cierto, al igual que si hubiera hecho 1 == 2. ¿Es lo suficientemente inteligente como para saber que int se puede convertir implícitamente en int? y ese int? se puede comparar con nulo. Sospecho que el optimizador es lo suficientemente inteligente como para desmantelar todo el bloque. – Keith