为什么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不会为值类型默认生成对应的重载方法吧