1. Introducción
¿Por qué hay que activar NRT aparte?
Nullable Reference Types (NRT) no es solo azúcar sintáctico, sino un ayudante serio del compilador para luchar contra errores relacionados con null. Pero por razones históricas este modo no está activado por defecto en todos los proyectos antiguos — para no romper la compatibilidad. Si creas un proyecto nuevo en las últimas versiones de .NET (por ejemplo, .NET 7, 8 o 9), lo más probable es que NRT ya esté activado automáticamente. Pero si tu proyecto es viejito o quieres controlar este modo manualmente, tienes que hacerlo explícitamente.
¿Qué hace el modo Nullable Reference Types?
Cuando este modo está activo, el compilador empieza a analizar qué variables de referencia pueden ser null y cuáles no. No afecta la ejecución del programa, pero te va a llenar de advertencias si ve un posible error. Es una forma genial de escribir código fiable, claro y robusto.
¿Cómo saber si el modo NRT está activado?
Si tienes un proyecto nuevo en .NET 6 o superior, seguramente NRT ya está activado. Pero nunca está de más comprobarlo.
- Abre el archivo del proyecto. Normalmente es el que termina en .csproj.
- Busca o añade la configuración <Nullable> dentro de la primera etiqueta <PropertyGroup>.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Si ahí pone <Nullable>disable</Nullable>, entonces el control de NRT está desactivado.
2. Cómo activar el modo NRT
Desde el .csproj — para todo el proyecto
- Abre (o crea) el archivo .csproj.
- Dentro del bloque <PropertyGroup> añade o cambia la línea:
<Nullable>enable</Nullable>
Ahora el compilador va a vigilar todos los archivos .cs del proyecto y te va a avisar si ve accesos peligrosos a null.
¿Por qué hacerlo así?
Porque es una configuración global. Desde este momento, todo el proyecto sigue las nuevas reglas: null está bajo sospecha, ¡y la dejadez ya no cuela!
Solo para archivos o trozos de código concretos
Si todavía no te animas a activar el modo estricto para todo el proyecto, puedes practicar en archivos concretos. Para eso se usan directivas de preprocesador:
#nullable enable
string? valor = null; // Aquí el análisis está activado
#nullable disable
string valorAntiguo = null; // Y aquí — ya no
#nullable restore
- #nullable enable — activa la comprobación hasta el final del archivo.
- #nullable disable — la desactiva.
- #nullable restore — recupera la configuración del .csproj o de un archivo externo.
Está guay: puedes activar el control estricto en módulos nuevos sin tocar el código viejo e inestable.
¿Qué más se puede poner en <Nullable>?
| Valor | Comportamiento |
|---|---|
|
Activa todo: anotaciones y advertencias |
|
Desactiva completamente el análisis de referencias null |
|
Solo advertencias, sin anotaciones obligatorias |
|
Se requieren anotaciones, pero el compilador no se queja |
|
Vuelve al comportamiento original (por ejemplo, el de la configuración global) |
Normalmente se usa enable o disable.
3. Demostración con ejemplo
Antes de activar NRT
// Modo antiguo, NRT desactivado
string s = null; // Sin quejas
Console.WriteLine(s.Length); // ¡Peligroso! Puede lanzar NullReferenceException
Después de activar NRT
// Modo nuevo, NRT activado
string s = null; // Advertencia: posible asignación de null
Console.WriteLine(s.Length); // Advertencia: posible acceso a null
Ahora el IDE va a subrayar los posibles problemas y el compilador te avisará: Dereference of a possibly null reference. (CS8602)
¿Cómo se arregla esto?
string? s = null;
if (s != null)
{
Console.WriteLine(s.Length);
}
Así dejas claro: esta variable puede ser null, y el compilador se queda tranquilo.
4. ¿Qué hacer si el proyecto es "a la antigua"?
Muchos proyectos se escribieron en la época en que null estaba en casi todas las variables de referencia. Al activar NRT, es como si contrataras a un auditor estricto que te va a avisar de cada posible problema.
¿Y si hay demasiadas advertencias?
No te agobies — son solo avisos, no errores. El programa sigue compilando igual.
- Puedes activar NRT solo en archivos nuevos.
- Poco a poco pon el código en orden: añade ?, haz comprobaciones de null, usa ! (de eso hablamos luego).
- Recuerda: cuanto más cuidadoso seas con null, menos problemas tendrás después.
Compatibilidad hacia atrás y librerías externas
- Activar NRT no cambia el comportamiento del código en tiempo de ejecución, solo añade análisis en compilación.
- El código antiguo puede mostrar muchas advertencias de golpe.
- Si usas librerías sin anotaciones NRT, el compilador será prudente y asumirá que todo puede ser null.
GO TO FULL VERSION