用户定义的结构是否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进行成员比较。