日期:2014-05-16  浏览次数:21088 次

为什么struct的实例,不能用==或者!=来做比较?
我下面的程序有编译问题:

        class c
        {
            public int i = 0;
        }
        struct s
        {
            public int i;
        }

        [STAThread]
        static void Main(string[] args)
        {
            c obj1 = new c();
            c obj2 = obj1;

            s st1 = new s();
            st1.i = 0;
            s st2 = st1;

            Console.WriteLine(obj1 == obj2);
            Console.WriteLine(obj1 != obj2);

            Console.WriteLine(st1 == st2);
            Console.WriteLine(st1 != st2);
        }

两条编译错误里面说:
Operator '==' cannot be applied to operands of type 'UseCom.Program.s' and 'UseCom.Program.s'
Operator '!=' cannot be applied to operands of type 'UseCom.Program.s' and 'UseCom.Program.s'

这难道是C#语法的限制吗? 为什么class可以比较而struct不可以呢?
------解决方案--------------------
首先class 比较 为引用比较,类似c++中的地址比较,只要指向同一个对象,就可以认为相等
struct是值比较,这就比较麻烦了,c++中是默认的是按位比较,只要二者的二进制数据一样就可以认为一样,但这样做有欠妥当。
比如有个struct 人的这样的结构,每个人 都有姓名这个字段 ,同名的人是不是可以认为相同?或者你想表示的同一个对象在不同的时间段有不同的属性,比如穿衣,穿马甲的赵本山,和穿大褂的赵本山就不相同了?
C#出于这样考虑(值比较)而让用户自己来实现。operator =  operator!= gethashcode等等。

------解决方案--------------------
struct类型是值类型,不能用引用比较,你需要比对里面字段相等
------解决方案--------------------
CLR不会为值类型默认生成对应的重载方法吧