由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来接收它们。然后我们需要对它们进行比较
很抱歉,上面代码不能运行,甚至它都不能编译
image 
为什么会报告这个错误呢?这是因为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));

 

 

 
posted @ 2010-03-29 12:25  陈希章  阅读(710)  评论(2编辑  收藏  举报