mayoría de la gente, cuando se escribe un tipo refence (clase) que implementa IComparable <T>, utilice la convención de que NULL es menos que cualquier objeto real. Pero si intenta utilizar la convención contrario, sucede algo muy interesante:IComparable algunos de los cuales son nulos
using System;
using System.Collections.Generic;
namespace SortingNulls
{
internal class Child : IComparable<Child>
{
public int Age;
public string Name;
public int CompareTo(Child other)
{
if (other == null)
return -1; // what's your problem?
return this.Age.CompareTo(other.Age);
}
public override string ToString()
{
return string.Format("{0} ({1} years)", this.Name, this.Age);
}
}
internal static class Program
{
private static void Main()
{
var listOfChilds = new List<Child>
{
null,
null,
null,
null,
new Child { Age = 5, Name = "Joe" },
new Child { Age = 6, Name = "Sam" },
new Child { Age = 3, Name = "Jude" },
new Child { Age = 7, Name = "Mary" },
null,
null,
null,
null,
new Child { Age = 7, Name = "Pete" },
null,
new Child { Age = 3, Name = "Bob" },
new Child { Age = 4, Name = "Tim" },
null,
null,
};
listOfChilds.Sort();
Console.WriteLine("Sorted list begins here");
for (int i = 0; i < listOfChilds.Count; ++i)
Console.WriteLine("{0,2}: {1}", i, listOfChilds[i]);
Console.WriteLine("Sorted list ends here");
}
}
}
Cuando se ejecuta el código anterior, se ve que las referencias nulas no se ordenan como se esperaba. Aparentemente, cuando se compara A a B, si A es un objeto y B es nulo, se usa la comparación definida por el usuario, pero si por el contrario A es nula y B es un objeto, en su lugar se usa alguna comparación BCL.
¿Esto es un error?
Nice answers. No había notado que la documentación decía que un objeto debe comparar mayor que nulo. Cuando A es nula y B no es nulo, el marco podría * * han intercambiado A y B, llamado a mi método, y luego se volcó la señal de la Int32 devuelto. Creo que a veces sucede con el viejo IComparable no genérico. Por supuesto con un IComparer o un delegado Comparación es fácil de manejar nulo como el primer parámetro. –
JeppeSN