Most people, when writing a refence type (class) that implements IComparable <T>, use a convention whose null value is less than any actual object. But if you try to use the opposite convention, something interesting will happen:
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 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"); } } }
When you run the above code, you see that null links are not sorted as expected. Apparently, when comparing A with B, if A is an object and B is null, a user comparison is used, but if A is null and B is an object, some BCL comparison is used instead.
This is mistake?