C# 为什么可以';派生类中声明的运算符是否隐藏基类中声明的运算符?
来自C#5.0规范 3.6签名和重载 运算符的签名由运算符的名称及其每个形式参数的类型组成,在 从左到右排列。操作员的签名明确表示 不包括结果类型 10.10运营商 与其他成员一样,基类中声明的运算符也是继承的 通过派生类。因为运算符声明总是需要 声明运算符参与的类或结构 在操作员的签名中,不可能出现 在派生类中声明的运算符以隐藏在派生类中声明的运算符 基类。因此,不需要新的修改器,因此 在操作员声明中不允许C# 为什么可以';派生类中声明的运算符是否隐藏基类中声明的运算符?,c#,C#,来自C#5.0规范 3.6签名和重载 运算符的签名由运算符的名称及其每个形式参数的类型组成,在 从左到右排列。操作员的签名明确表示 不包括结果类型 10.10运营商 与其他成员一样,基类中声明的运算符也是继承的 通过派生类。因为运算符声明总是需要 声明运算符参与的类或结构 在操作员的签名中,不可能出现 在派生类中声明的运算符以隐藏在派生类中声明的运算符 基类。因此,不需要新的修改器,因此 在操作员声明中不允许 第一段没有说“类或结构 操作员被声明为“是操作员签名的一部分”。所以 “运算符”
静态T添加(T第一,T第二)
,=
类似于静态无效分配(参考T位置,T值)
等等。C#中的某些运算符可以重载,而有些运算符(如赋值=
运算符)不能重载。当编译器看到一个可以重载的操作符时,它应该找到相应的静态函数来使用(除非这个函数是内置的,比如整数加法)。因此,假设编译器看到a+b
,其中a
是TypeA
,b
是TypeB
。编译器转到类型TypeA
和TypeB
(以及它们的父类,如有必要),查看是否有一个静态函数,该函数的名称和签名与给定的大小写匹配。在这种情况下,它应该是公共静态int op_Addition(TypeAOrBaseType a,TypeBOrBaseType b)
(操作符+
将被编译成名为op_Addition
的方法)。从这一点可以清楚地看出,为什么您在其中声明运算符的类应该参与运算符签名-如果您在typeTypeA
中声明类似于static int operator+(TypeC a,typeb)
的内容,它就永远不能被使用,因为当您添加TypeC
和TypeD
-编译器将永远不会在TypeA
中查找相应的运算符-为什么会这样?它将在TypeC
和TypeD
中查找this
关键字一起使用)不清楚。。。既然无法匹配派生类中基类运算符的签名,那么您希望隐藏发生的情况是什么?@Alexei:是什么阻止您编写
静态公共booloperator@BenVoigt说得好。。。刚试过-不抱怨隐藏,但在通话时变得模棱两可。(不知道为什么人们会出于理智的意图这么做)@BenVoigt、Tim和Alexei:只是出于好奇,为什么这个问题很重要,为什么要逐字阅读说明书?我的意思是我们能不能说规格可能是错的?我问这个问题是因为为什么人们会如此仔细地阅读规范?@CodingYoshi C#通常设计用于防止可能混淆的事情(比如不允许在嵌套范围中使用相同的变量),因此最好理解如何/为什么编写特定规则。也就是说,如果一个人试图创建自定义数字类型,而对运算符重载规则缺乏良好的理解,可能会造成相当大的痛苦。。。(顺便说一句,如果C#规范中与运算符重载相关的部分是错误的,我会非常惊讶,因为该部分到目前为止已经经历了7个版本,而且确实可能是错误的)