运算符语句

声明在类或结构上定义运算符过程的运算符符号、作数和代码。

语法

[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
    [ statements ]
    [ statements ]
    Return returnvalue
    [ statements ]
End Operator

部件

attrlist
可选。 请参阅 属性列表

Public
必填。 指示此运算符过程具有 公共 访问权限。

Overloads
可选。 请参阅 重载

Shared
必填。 指示此运算符过程是 共享 过程。

Shadows
可选。 查看 阴影

Widening
转换运算符是必需的,除非指定 Narrowing。 指示此运算符过程定义 加宽 转换。 请参阅此帮助页上的“扩大和缩小转换”。

Narrowing
转换运算符是必需的,除非指定 Widening。 指示此运算符过程定义 转换。 请参阅此帮助页上的“扩大和缩小转换”。

operatorsymbol
必填。 此运算符过程定义的运算符的符号或标识符。

operand1
必填。 一元运算符(包括转换运算符)或二元运算符的左作数的名称和类型。

operand2
二进制运算符是必需的。 二进制运算符的右作数的名称和类型。

operand1operand2 具有以下语法和部分:

[ ByVal ] operandname [ As operandtype ]

部件 DESCRIPTION
ByVal 可选,但传递机制必须是 ByVal
operandname 必填。 表示此作数的变量的名称。 请参阅 声明的元素名称
operandtype 可选,除非 Option StrictOn。 此作数的数据类型。

type
可选,除非 Option StrictOn。 运算符过程返回的值的数据类型。

statements
可选。 运算符过程运行的语句块。

returnvalue
必填。 运算符过程返回给调用代码的值。

End Operator
必填。 终止此运算符过程的定义。

注解

只能在类或结构中使用 Operator 。 这意味着运算符的 声明上下文 不能是源文件、命名空间、模块、接口、过程或块。 有关详细信息,请参阅 声明上下文和默认访问级别

所有运算符都必须是 Public Shared。 不能为任一作数指定ByRefOptionalParamArray指定作数。

不能使用运算符符号或标识符来保存返回值。 必须使用该 Return 语句,并且必须指定一个值。 过程中的任意位置都可以显示任意数量的 Return 语句。

无论是否使用Overloads关键字,都以这种方式定义运算符称为运算符重载。 下表列出了可以定义的运算符。

类型 运营商
一元 +-IsFalseIsTrueNot
二进制 +-*/\&^>><<=<>>>=<<=AndLikeModOrXor
转换 (一元) CType

请注意, = 二进制列表中的运算符是比较运算符,而不是赋值运算符。

定义CType时,必须指定或WideningNarrowing指定 。

匹配对

必须将某些运算符定义为匹配对。 如果定义此类对的任一运算符,则还必须定义另一个运算符。 匹配的对如下:

  • =<>

  • ><

  • >=<=

  • IsTrueIsFalse

数据类型限制

定义的每个运算符都必须涉及在其中定义它的类或结构。 这意味着类或结构必须显示为以下数据类型:

  • 一元运算符的作数。

  • 至少一个二元运算符的作数。

  • 作数或转换运算符的返回类型。

某些运算符具有其他数据类型限制,如下所示:

  • 如果定义 IsTrueIsFalse 运算符,它们必须同时返回类型 Boolean

  • 如果定义<<>>运算符,它们必须同时指定Integeroperandtypeoperand2类型。

返回类型不必对应于任一作数的类型。 例如,即使两个作数都不是,也可以返回Boolean比较运算符=<>Boolean

逻辑运算符和按位运算符

AndOrNotXor运算符可以在 Visual Basic 中执行逻辑作或按位运算。 但是,如果在类或结构上定义这些运算符之一,则只能定义它的按位运算。

不能使用语句直接Operator定义AndAlso运算符。 但是,如果满足以下条件,则可以使用 AndAlso

  • 已在要用于AndAlso的相同作数类型上定义And

  • And定义返回的类型与已定义它的类或结构相同。

  • 已在已定义的类或结构上定义IsFalseAnd运算符。

同样,如果在同一作数上定义Or,并且具有类或结构的返回类型,并且已在类或结构上定义IsTrue,则可以使用OrElse

扩大和缩小转换

扩大转换始终在运行时成功,而缩小转换在运行时可能会失败。 有关详细信息,请参阅 “扩大和缩小转换”。

如果声明转换过程为 Widening,则过程代码不得生成任何失败。 这表示:

  • 它必须始终返回类型 type的有效值。

  • 它必须处理所有可能的异常和其他错误条件。

  • 它必须处理它调用的任何过程返回的任何错误。

如果转换过程可能不成功,或者可能导致未经处理的异常,则必须声明它为 < a0/>。

示例:

下面的代码示例使用Operator语句来定义包含运算符过程And的结构的大纲,OrIsFalse以及IsTrue运算符。 And 并且 Or 每个作数采用两个类型 abc 和返回类型 abcIsFalse 并且 IsTrue 每个作数采用一个类型 abc 并返回 Boolean。 这些定义允许调用代码使用 AndAndAlsoOr数和 OrElse 类型 abc作数。

Public Structure abc
    Dim d As Date
    Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc
        Dim r As New abc
        ' Insert code to calculate And of x and y.
        Return r
    End Operator
    Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc
        Dim r As New abc
        ' Insert code to calculate Or of x and y.
        Return r
    End Operator
    Public Shared Operator IsFalse(ByVal z As abc) As Boolean
        Dim b As Boolean
        ' Insert code to calculate IsFalse of z.
        Return b
    End Operator
    Public Shared Operator IsTrue(ByVal z As abc) As Boolean
        Dim b As Boolean
        ' Insert code to calculate IsTrue of z.
        Return b
    End Operator
End Structure

另请参阅