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