Porque para tener un valor "nulo", el tipo debe ser anulable. Esto funciona bien para los tipos de referencia (cualquier clase que se define y la biblioteca estándar), y si te fijas verás que las personas hacen utilización nula siempre que tengan un objeto de referencia sin valor
Employee employee = Employees.Find("John Smith");
if(employee == null) throw new Exception("Employee not found");
La cuestión viene cuando usa valor tipos como int, char o float. A diferencia de los tipos de referencia, que apuntan a un bloque de datos en otro lugar de la memoria, estos valores se almacenan y manipulan en línea (no hay puntero/referencia).
Debido a esto, de forma predeterminada, los tipos de valor no tienen un valor nulo. En el código que proporcionó, es imposible para que parentID sea nulo (estoy realmente sorprendido de que esto haya pasado con su compilador: Visual Studio 2008 y probablemente 2005 dibujará un subrayado verde y le dirá que la declaración es siempre falsa) .
Para que un int tener un valor nulo, es necesario declarar como anulable
int? parentID;
Ahora parentID puede contener un valor nulo, porque ahora es un puntero (bueno " referencia ") a un entero de 32 bits, en lugar de solo un entero de 32 bits.
Espero que comprenda por qué los "valores mágicos" se utilizan a menudo para representar null con los tipos básicos (tipos de valores). Es simplemente un montón de problemas, y a menudo un gran golpe de rendimiento (buscar lo que es el boxeo/unboxing), para almacenar estos tipos de valores como una referencia al valor para permitir que sean nulos.
Editar: Para mayor referencia sobre el boxeo/unboxing (lo que es necesario tener un int == null), ver el artículo en MSDN:
Boxing y unboxing (C# Guía de programación)
Rendimiento
En relación con las asignaciones simples, el boxeo y el desempaquetado son procesos computacionalmente costosos. Cuando se encuadra un tipo de valor, se debe asignar y construir un nuevo objeto. En menor grado, el elenco requerido para el desempaquetado también es costoso computacionalmente. Para obtener más información, vea Rendimiento.
Haría mucho mejor si mostrara un ejemplo al menos. – GEOCHET
-1: sin código. -1: no hay problema ¿Cuál es el problema? ¿Qué no funciona? –
Ha invertido el cheque (debería ser parentID! = Null), pero creo que la pregunta es válida. +1 – erikkallen