用户定义的结构是否继承了重载的==运算符?

时间:2011-05-12 19:27:26

标签: c# .net struct operator-overloading

如果引用类型不重载等于运算符==,则将使用Object上的内置相等运算符。为什么用户定义的structs不一样:

struct A{ }

static void Main(string[] args)
{
    A a = new A();
    A a1 = new A();
    bool equal= (a == a1); //error
} 

即,ValueType(所有structs派生的)是否也超载==运算符?

2 个答案:

答案 0 :(得分:5)

这样的默认==运算符如何工作?对于引用类型,比较地址是合理的,但是因为对于两个ValueTypes,检查永远不会成立(因为如果两个ValueTypes在范围内,那么它们保证在堆栈上具有不同的位置),地址比较是没有意义的。

正如编译器所指出的那样,ValueType非常故意没有默认的==运算符。

答案 1 :(得分:4)

结构可能不提供默认的==运算符实现,因为与类实例不同,结构没有引用样式标识的概念。

From the guidelines

  

实施平等运营商   (==)值类型

     

在大多数编程语言中都有   没有默认的实现   值的等于运算符(==)   类型。因此,你应该超载   ==任何时候平等都是有意义的。

     

你应该考虑实施   等于值类型的方法因为   默认实现   System.ValueType将不会执行   以及您的自定义实现。

     

实施==任何时候覆盖   等于方法。

然而,结构提供了一个默认的Equals 方法实现,它将执行memberwise compare using reflection.