实现IComparable

我正在将IComparable归类为类似对象的排序。 我的问题是为什么它将类型转换为int32? 数组的Sort()似乎将数组中的每个类型转换为我用于比较的类型。

可比:

public class Person:IComparable { protected int age; public int Age { get; set; } public int CompareTo(object obj) { if(obj is Person) { var person = (Person) obj; return age.CompareTo(person.age); } else { throw new ArgumentException("Object is not of type Person"); } } } 

}

 class Program { static void Main(string[] args) { Person p1 = new Person(); Person p2 = new Person(); Person p3 = new Person(); Person p4 = new Person(); ArrayList array = new ArrayList(); array.Add(p1.Age = 6); array.Add(p2.Age = 10); array.Add(p3.Age = 5); array.Add(p4.Age = 11); array.Sort(); foreach (var list in array) { var person = (Person) list; //Cast Exception here. Console.WriteLine(list.GetType().ToString()); //Returns System.Int32 } Console.ReadLine(); } 

你的路线:

 array.Add(p1.Age = 6) 

将语句p1.Age = 6的结果添加到ArrayList。 这是int值6.与IComparable或Sort无关。

实现IComparable的最佳方法是实现IComparable并将调用传递给该实现:

 class Person : IComparable, IComparable { public int Age { get; set; } public int CompareTo(Person other) { // Should be a null check here... return this.Age.CompareTo(other.Age); } public int CompareTo(object obj) { // Should be a null check here... var otherPerson = obj as Person; if (otherPerson == null) throw new ArgumentException("..."); // Call the generic interface's implementation: return CompareTo(otherPerson); } } 

你没有将人员添加到数组中。

 p1.Age = 6 

是一个赋值,它返回赋给变量/属性的任何东西(在本例中为6)。

在将Persons放入数组之前,您需要执行分配。

如果您只想将单个类型的元素放入集合中,则需要使用类型化集合而不是非类型集合。 这会立即解决问题。

你正在添加person.Age到你的arraylist和person.Age是一个int。
你应该做点什么

 Person p1 = new Person(){Age=3}; array.Add(p1);