声明在类或结构上定义运算符过程的运算符符号、作数和代码。
语法
[ <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
二进制运算符是必需的。 二进制运算符的右作数的名称和类型。
operand1 并 operand2 具有以下语法和部分:
[ ByVal ] operandname [ As operandtype ]
| 部件 | DESCRIPTION |
|---|---|
ByVal |
可选,但传递机制必须是 ByVal。 |
operandname |
必填。 表示此作数的变量的名称。 请参阅 声明的元素名称。 |
operandtype |
可选,除非 Option Strict 是 On。 此作数的数据类型。 |
type
可选,除非 Option Strict 是 On。 运算符过程返回的值的数据类型。
statements
可选。 运算符过程运行的语句块。
returnvalue
必填。 运算符过程返回给调用代码的值。
End
Operator
必填。 终止此运算符过程的定义。
注解
只能在类或结构中使用 Operator 。 这意味着运算符的 声明上下文 不能是源文件、命名空间、模块、接口、过程或块。 有关详细信息,请参阅 声明上下文和默认访问级别。
所有运算符都必须是 Public Shared。 不能为任一作数指定ByRef或OptionalParamArray指定作数。
不能使用运算符符号或标识符来保存返回值。 必须使用该 Return 语句,并且必须指定一个值。 过程中的任意位置都可以显示任意数量的 Return 语句。
无论是否使用Overloads关键字,都以这种方式定义运算符称为运算符重载。 下表列出了可以定义的运算符。
| 类型 | 运营商 |
|---|---|
| 一元 |
+、-、IsFalse、IsTrue、Not |
| 二进制 |
+、-、*、/、\、&、^、>>、<<、=、<>、>、>=、<、<=、And、Like、Mod、Or、Xor |
| 转换 (一元) | CType |
请注意, = 二进制列表中的运算符是比较运算符,而不是赋值运算符。
定义CType时,必须指定或WideningNarrowing指定 。
匹配对
必须将某些运算符定义为匹配对。 如果定义此类对的任一运算符,则还必须定义另一个运算符。 匹配的对如下:
=和<>>和<>=和<=IsTrue和IsFalse
数据类型限制
定义的每个运算符都必须涉及在其中定义它的类或结构。 这意味着类或结构必须显示为以下数据类型:
一元运算符的作数。
至少一个二元运算符的作数。
作数或转换运算符的返回类型。
某些运算符具有其他数据类型限制,如下所示:
如果定义
IsTrue和IsFalse运算符,它们必须同时返回类型Boolean。如果定义
<<和>>运算符,它们必须同时指定Integeroperandtype其operand2类型。
返回类型不必对应于任一作数的类型。 例如,即使两个作数都不是,也可以返回Boolean比较运算符=<>。Boolean
逻辑运算符和按位运算符
And、OrNot和Xor运算符可以在 Visual Basic 中执行逻辑作或按位运算。 但是,如果在类或结构上定义这些运算符之一,则只能定义它的按位运算。
不能使用语句直接Operator定义AndAlso运算符。 但是,如果满足以下条件,则可以使用 AndAlso :
已在要用于
AndAlso的相同作数类型上定义And。And定义返回的类型与已定义它的类或结构相同。已在已定义的类或结构上定义
IsFalseAnd运算符。
同样,如果在同一作数上定义Or,并且具有类或结构的返回类型,并且已在类或结构上定义IsTrue,则可以使用OrElse。
扩大和缩小转换
扩大转换始终在运行时成功,而缩小转换在运行时可能会失败。 有关详细信息,请参阅 “扩大和缩小转换”。
如果声明转换过程为 Widening,则过程代码不得生成任何失败。 这表示:
它必须始终返回类型
type的有效值。它必须处理所有可能的异常和其他错误条件。
它必须处理它调用的任何过程返回的任何错误。
如果转换过程可能不成功,或者可能导致未经处理的异常,则必须声明它为
示例:
下面的代码示例使用Operator语句来定义包含运算符过程And的结构的大纲,OrIsFalse以及IsTrue运算符。
And 并且 Or 每个作数采用两个类型 abc 和返回类型 abc。
IsFalse 并且 IsTrue 每个作数采用一个类型 abc 并返回 Boolean。 这些定义允许调用代码使用 And、 AndAlso作 Or数和 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