声明在类或结构上定义运算符过程的运算符符号、作数和代码。
语法
[ <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
或Optional
ParamArray
指定作数。
不能使用运算符符号或标识符来保存返回值。 必须使用该 Return
语句,并且必须指定一个值。 过程中的任意位置都可以显示任意数量的 Return
语句。
无论是否使用Overloads
关键字,都以这种方式定义运算符称为运算符重载。 下表列出了可以定义的运算符。
类型 | 运营商 |
---|---|
一元 |
+ 、- 、IsFalse 、IsTrue 、Not |
二进制 |
+ 、- 、* 、/ 、\ 、& 、^ 、>> 、<< 、= 、<> 、> 、>= 、< 、<= 、And 、Like 、Mod 、Or 、Xor |
转换 (一元) | CType |
请注意, =
二进制列表中的运算符是比较运算符,而不是赋值运算符。
定义CType
时,必须指定或Widening
Narrowing
指定 。
匹配对
必须将某些运算符定义为匹配对。 如果定义此类对的任一运算符,则还必须定义另一个运算符。 匹配的对如下:
=
和<>
>
和<
>=
和<=
IsTrue
和IsFalse
数据类型限制
定义的每个运算符都必须涉及在其中定义它的类或结构。 这意味着类或结构必须显示为以下数据类型:
一元运算符的作数。
至少一个二元运算符的作数。
作数或转换运算符的返回类型。
某些运算符具有其他数据类型限制,如下所示:
如果定义
IsTrue
和IsFalse
运算符,它们必须同时返回类型Boolean
。如果定义
<<
和>>
运算符,它们必须同时指定Integer
operandtype
其operand2
类型。
返回类型不必对应于任一作数的类型。 例如,即使两个作数都不是,也可以返回Boolean
比较运算符=
<>
。Boolean
逻辑运算符和按位运算符
And
、Or
Not
和Xor
运算符可以在 Visual Basic 中执行逻辑作或按位运算。 但是,如果在类或结构上定义这些运算符之一,则只能定义它的按位运算。
不能使用语句直接Operator
定义AndAlso
运算符。 但是,如果满足以下条件,则可以使用 AndAlso
:
已在要用于
AndAlso
的相同作数类型上定义And
。And
定义返回的类型与已定义它的类或结构相同。已在已定义的类或结构上定义
IsFalse
And
运算符。
同样,如果在同一作数上定义Or
,并且具有类或结构的返回类型,并且已在类或结构上定义IsTrue
,则可以使用OrElse
。
扩大和缩小转换
扩大转换始终在运行时成功,而缩小转换在运行时可能会失败。 有关详细信息,请参阅 “扩大和缩小转换”。
如果声明转换过程为 Widening
,则过程代码不得生成任何失败。 这表示:
它必须始终返回类型
type
的有效值。它必须处理所有可能的异常和其他错误条件。
它必须处理它调用的任何过程返回的任何错误。
如果转换过程可能不成功,或者可能导致未经处理的异常,则必须声明它为
示例:
下面的代码示例使用Operator
语句来定义包含运算符过程And
的结构的大纲,Or
IsFalse
以及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