共用方式為


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
必要。 表示這個運算子程序具有 Public 存取權。

Overloads
選擇性。 請參閱多載

Shared
必要。 表示這個運算子程序是一個 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 關鍵字)。 下表列出您可以定義的運算子清單。

類型 操作員
一元 +, -, IsFalse, IsTrue, Not
二進位 +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor
轉換 (一元) CType

請注意,二元清單中的 = 運算子是比較運算子,而不是指派運算子。

當您定義 CType 時,必須指定 WideningNarrowing

相應的對組

您必須將特定的運算子定義為相應的對組。 如果您定義這類對組的任一個運算子,也必須定義另一個運算子。 相應的對組如下:

  • =<>

  • ><

  • >=<=

  • IsTrueIsFalse

資料類型限制

您所定義的每一個運算子都必須包含您在其上定義它的類別或結構。 這表示該類別或結構必須以下列的資料類型出現:

  • 一元運算子的運算元。

  • 二元運算子的至少其中一個運算元。

  • 轉換運算子的運算元或傳回類型。

某些運算子有其他的資料類型限制,如下所示:

  • 如果您定義 IsTrueIsFalse 運算子,則它們都必須傳回 Boolean 類型。

  • 如果您定義 <<>> 運算子,則它們都必須為 operand2operandtype 指定 Integer 類型。

傳回類型不必對應於任一運算元的類型。 例如,比較運算子 (如 =<>) 可以傳回 Boolean,即使兩個運算元都不是 Boolean 也一樣。

邏輯運算子和位元運算子

在 Visual Basic 中,AndOrNotXor 運算子可以執行邏輯或位元運算。 不過,如果您在類別或結構上定義了這些其中一個運算子,則只能定義其位元運算。

您不能使用 Operator 陳述式來直接定義 AndAlso 運算子。 不過,如果您滿足了下列條件,則可以使用 AndAlso

  • 您已在要用於 And 的相同運算元類型上定義了 AndAlso

  • 您對 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

另請參閱