Operator 陳述式
更新:2007 年 11 月
宣告會在類別或結構上定義運算子程序的運算子符號、運算元和程式碼。
[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ] Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ] [ statements ] [ statements ] Return returnvalue [ statements ] End Operator
參數
attrlist
選擇項。請參閱屬性清單。Public
必要項。表示這個運算子程序具有 Public (Visual Basic) 存取權。Overloads
選擇項。請參閱 Overloads。Shared
必要項。表示這個運算子程序是 Shared (Visual Basic) 程序。Shadows
選擇項。請參閱 Shadows。Widening
除非您指定 Narrowing,否則這會是轉換運算子的必要項。表示這個運算子程序會定義 Widening 轉換。請參閱本說明網頁上「擴大和縮小轉換」的內容。Narrowing
除非您指定 Widening,否則這會是轉換運算子的必要項。表示這個運算子程序會定義 Narrowing 轉換。請參閱本說明網頁上「擴大和縮小轉換」的內容。operatorsymbol
必要項。這個運算子程序所定義之運算子的符號或識別項。operand1
必要項。一元 (Unary) 運算子 (包括轉換運算子) 之單一運算元的名稱和型別,或是二元 (Binary) 運算子之左運算元的名稱和型別。operand2
二元運算子的必要項。二元運算子之右運算元的名稱和型別。operand1 和 operand2 具有下列語法和參數:
[ ByVal ] operandname [ As operandtype ]
參數
描述
ByVal
選擇項,但是傳遞機制必須是 ByVal。
operandname
必要項。代表這個運算元的變數名稱。請參閱宣告項目名稱。
operandtype
除非 Option Strict 為 On,否則為選擇項。這個運算元的資料型別。
type
除非 Option Strict 為 On,否則為選擇項。運算子程序所傳回之值的資料型別。statements
選擇項。運算子程序所執行的陳述式區塊。returnvalue
必要項。運算子程序傳回給呼叫程式碼的值。EndOperator
必要項。結束這個運算子程序的定義。
備註
您只能在類別或結構中使用 Operator。這表示運算子的「宣告內容」不能是原始程式檔 (Source File)、命名空間 (Namespace)、模組、介面、程序和區塊。如需詳細資訊,請參閱宣告內容和預設存取層級。
所有運算子都必須為 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,則程序程式碼不得產生任何失敗。這表示:
它永遠必須傳回型別 type 的有效值。
它必須處理所有可能的例外狀況 (Exception) 和其他錯誤情況。
它必須處理所呼叫之程序傳回的任何錯誤。
如果轉換程序有可能不成功,或它有可能會造成無法處理的例外狀況,則您必須將它宣告為 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