Operator Statement

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

语法

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

组成部分

attrlist
可选。 请参阅属性列表

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

Overloads
可选。 请参阅 Overloads

Shared
必需。 指示此运算符过程是一个共享过程。

Shadows
可选。 请参阅 Shadows

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

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

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

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

operand2
对于二元运算符而言是必需的。 二元运算符的右操作数的名称和类型。

operand1operand2 具有以下语法和组成部分:

[ ByVal ] operandname [ As operandtype ]

组成部分 说明
ByVal 可选,但传递机制必须是 ByVal
operandname 必需。 表示此操作数的变量的名称。 请参阅 Declared Element Names
operandtype 可选,除非 Option StrictOn。 此操作数的数据类型。

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

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

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

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

注解

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

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

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

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

类型 运算符
一元
二进制
转换(一元) CType

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

在定义 CType 时,必须指定 WideningNarrowing

匹配对

必须将某些运算符定义为匹配对。 如果你定义了这样一对运算符中的任何一个,也必须定义另一个。 匹配对如下所示:

  • =<>

  • ><

  • >=<=

  • IsTrueIsFalse

数据类型限制

你定义的每个运算符都必须涉及你定义它的类或结构。 这意味着,类或结构必须作为以下项的数据类型出现:

  • 一元运算符的操作数。

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

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

某些运算符具有额外的数据类型限制,如下所示:

  • 如果你定义了 IsTrueIsFalse 运算符,它们必须都返回 Boolean 类型。

  • 如果你定义了 <<>> 运算符,它们必须都为 operand2operandtype 指定 Integer 类型。

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

逻辑运算符和位运算符

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

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

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

  • 你对 And 的定义返回的类型与你用于定义它的类或结构的类型相同。

  • 你已在定义 And 的类或结构上定义了 IsFalse 运算符。

同样,如果你在相同的操作数上定义了 Or,并且返回类型为类或结构,而且你还在类或结构上定义了 IsTrue,则可以使用 OrElse

Widening and Narrowing Conversions

扩大转换在运行时总是成功的,而收缩转换在运行时可能失败。 有关详细信息,请参阅 Widening and Narrowing Conversions

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

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

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

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

如果一个转换过程有可能不成功,或者有可能导致一个未处理的异常,必须将其声明为 Narrowing

示例

下面的代码示例使用 Operator 语句来定义一个结构的大纲,该结构包括 AndOrIsFalseIsTrue 运算符的运算符过程。 AndOr 各采用两个类型为 abc 的操作数并返回类型 abcIsFalseIsTrue 各采用一个类型为 abc 的操作数并返回 Boolean。 这些定义允许调用代码将 AndAndAlsoOrOrElse 与类型 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

另请参阅