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
对于二元运算符而言是必需的。 二元运算符的右操作数的名称和类型。
operand1
和 operand2
具有以下语法和组成部分:
[ ByVal ] operandname [ As operandtype ]
组成部分 | 说明 |
---|---|
ByVal |
可选,但传递机制必须是 ByVal。 |
operandname |
必需。 表示此操作数的变量的名称。 请参阅 Declared Element Names。 |
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
类型。如果你定义了
<<
和>>
运算符,它们必须都为operand2
的operandtype
指定Integer
类型。
返回类型不必与任一操作数的类型相对应。 例如,即使两个操作数都不是 Boolean
,比较运算符(如 =
或 <>
)也可以返回 Boolean
。
逻辑运算符和位运算符
And
、Or
、Not
和 Xor
运算符可以在 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
语句来定义一个结构的大纲,该结构包括 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