这是一个小问题,请看下面的代码
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));