由object不能比较引发的问题
这是一个小问题,请看下面的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { class Program { static void Main(string[] args) { object a = 5; object b = 6; //直接利用object进行比较 Console.WriteLine(a > b); } } }
我们假设有两个变量,其实它们是int,但程序用object来接收它们。然后我们需要对它们进行比较
很抱歉,上面代码不能运行,甚至它都不能编译
为什么会报告这个错误呢?这是因为object这个基础类型并没有实现类似于IComparable之类的接口,也就是说它们的值本身是无法比较的。
那么这又是为什么呢?因为Object其实是引用类型,同时又因为任何数据都可以用Object表示,所以其他它不可能知道到底怎么比较不同object直接的值的
例如,你可能会那一个int的数值(5)去跟一个Employee的数值(例如某个实例)比较,大家想想它怎么可能知道应该怎么比较呢?
ok,那么如何解决我们上面的问题呢,假设我们希望两个object可以比较,有何方法呢?
其实是有可能实现的,我们再来看下面的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { class Program { static void Main(string[] args) { object a = 5; object b = 6; //直接利用object进行比较 Console.WriteLine(a.GetHashCode() > b.GetHashCode()); Console.Read(); } } }
这样我们就实现了比较了,我们分别对两个object去获取HashCode,这个方法返回的是int,既然是int当然就可以比较了。
那么,也就是说其实任何类型都可以通过实现GetHashCode方法,来提供这个支持
class Employee { public override int GetHashCode() { return base.GetHashCode(); } }
那么,如果不重写这个方法,默认的HashCode是多少呢?猜猜看吧
答案是:这是一个随机的Int数值。
最后,我们可以考虑为Object实现一个扩展方法,让它可以”比较”
public static class ObjectExtensions { public static int CompareTo(this object obj1, object obj2) { return obj1.GetHashCode().CompareTo(obj2.GetHashCode()); } }
然后就可以使用下面这样的方式去比较
Console.WriteLine(a.CompareTo(b));