C# 为什么可以';派生类中声明的运算符是否隐藏基类中声明的运算符?

C# 为什么可以';派生类中声明的运算符是否隐藏基类中声明的运算符?,c#,C#,来自C#5.0规范 3.6签名和重载 运算符的签名由运算符的名称及其每个形式参数的类型组成,在 从左到右排列。操作员的签名明确表示 不包括结果类型 10.10运营商 与其他成员一样,基类中声明的运算符也是继承的 通过派生类。因为运算符声明总是需要 声明运算符参与的类或结构 在操作员的签名中,不可能出现 在派生类中声明的运算符以隐藏在派生类中声明的运算符 基类。因此,不需要新的修改器,因此 在操作员声明中不允许 第一段没有说“类或结构 操作员被声明为“是操作员签名的一部分”。所以 “运算符”

来自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
    的方法)。从这一点可以清楚地看出,为什么您在其中声明运算符的类应该参与运算符签名-如果您在type
    TypeA
    中声明类似于
    static int operator+(TypeC a,typeb)
    的内容,它就永远不能被使用,因为当您添加
    TypeC
    TypeD
    -编译器将永远不会在
    TypeA
    中查找相应的运算符-为什么会这样?它将在
    TypeC
    TypeD
    中查找

  • 当然,正则方法不是这样的-在正则方法中,您可以在签名中使用任何类型,并且不需要在签名中使用声明类型的实例(尽管您可能会说,在实例方法中声明类型的实例总是隐式传递的,并且可以与
    this
    关键字一起使用)

  • 隐藏对运算符没有多大意义,因为很难在父类和子类中使用完全相同的签名生成有意义的运算符。在注释中,您可以看到仍然可以生成这样的运算符(这是无用的),但即使这样,它也不会隐藏,因为如果它是隐藏的,那么应该在使用时选择其中一个运算符(从子类或从父类),但编译器会抱怨不明确。对于常规方法,隐藏通常是有用的,因此是允许的


  • 不清楚。。。既然无法匹配派生类中基类运算符的签名,那么您希望隐藏发生的情况是什么?@Alexei:是什么阻止您编写
    静态公共booloperator@BenVoigt说得好。。。刚试过-不抱怨隐藏,但在通话时变得模棱两可。(不知道为什么人们会出于理智的意图这么做)@BenVoigt、Tim和Alexei:只是出于好奇,为什么这个问题很重要,为什么要逐字阅读说明书?我的意思是我们能不能说规格可能是错的?我问这个问题是因为为什么人们会如此仔细地阅读规范?@CodingYoshi C#通常设计用于防止可能混淆的事情(比如不允许在嵌套范围中使用相同的变量),因此最好理解如何/为什么编写特定规则。也就是说,如果一个人试图创建自定义数字类型,而对运算符重载规则缺乏良好的理解,可能会造成相当大的痛苦。。。(顺便说一句,如果C#规范中与运算符重载相关的部分是错误的,我会非常惊讶,因为该部分到目前为止已经经历了7个版本,而且确实可能是错误的)