C#Intermedio6 nov 2025

Cuando null no es tan null como crees... ¡para 'is object'!

snippet.c#
int? nullableInt = null;
object regularObject = null;
Console.WriteLine($"nullableInt is object: {nullableInt is object}");
Console.WriteLine($"regularObject is object: {regularObject is object}");

¿Qué crees que imprime?

Salida Esperada

nullableInt is object: False
regularObject is object: False

⚠️ Salida Real

nullableInt is object: True
regularObject is object: False

¿Por qué pasa esto?

¡Prepárate para un giro de guion en la tierra de C#! 🎢 Aquí, el `null` no siempre significa `null` cuando bailas con `is object`. - `nullableInt` es un `int?`, o sea, un `Nullable<int>`. ¡Y `Nullable<T>` es un **struct**! - Todos los `struct` en C# son tipos de valor que pueden ser **boxeados** a `object`. ¡Son como mini-objetos en sí mismos! 📦 - Así que, cuando haces `nullableInt is object`, C# no pregunta si el *valor* dentro de `nullableInt` es un objeto. ¡Pregunta si la *instancia de `Nullable<int>`* puede ser tratada como un `object`! Y como es un `struct`, la respuesta es **SÍ**, incluso si su valor interno es `null`. Es como si el embalaje fuera un objeto, ¡aunque no haya nada dentro! - En cambio, `regularObject` es una **referencia** a un objeto. Si es `null`, significa que no apunta a NADA. No hay instancia, no hay objeto. Por eso `regularObject is object` es `false`. ¡Es un choque entre la ausencia de un valor y la naturaleza de un tipo! ¡C# y sus sutilezas!

Conceptos relacionados

nullable-typestype-checkingboxing