Unity shows destroyed objects as "null" , but they aren’t real C# nulls.
Unity’s (==) operator only works if the compiler knows the type is UnityEngine.Object.
In your class, "T" isn’t constrained, so C# uses a normal comparison that’s why list[i] == null returns false.