用户定义的结构是否inheritance了重载的==运算符?
如果引用类型不重载等于运算符==
,则将使用Object
上的内置相等运算符。 为什么用户定义的structs
不一样:
struct A{ } static void Main(string[] args) { A a = new A(); A a1 = new A(); bool equal= (a == a1); //error }
也就是说, ValueType
(所有structs
派生自哪个)也不会重载==
运算符?
这样的默认==运算符如何工作? 对于引用类型,比较地址是合理的,但是因为对于两个ValueTypes,检查永远不会成立(因为如果两个ValueTypes在范围内,那么它们保证在堆栈上具有不同的位置),地址比较是没有意义的。
正如编译器所指出的那样,ValueType非常有意地没有默认的==运算符。
结构可能不提供默认的==运算符实现,因为与类实例不同,结构没有引用样式标识的概念。
从指南 :
在值类型上实现等式运算符(==)
在大多数编程语言中,对于值类型,没有对等于运算符(==)的默认实现。 因此,你应该重载==任何时候平等是有意义的。
您应该考虑在值类型上实现Equals方法,因为System.ValueType上的默认实现不会像您的自定义实现那样执行。
在重写Equals方法的任何时候实现==。
但是,结构确实提供了一个默认的Equals 方法实现,它将使用reflection进行成员比较。