クラスまたは構造体の演算子プロシージャを定義する演算子シンボル、オペランド、およびコードを宣言します。
構文
[ <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
必須。 この演算子プロシージャが Shared プロシージャであることを示します。
Shadows
任意。 「 影」を参照してください。
Widening
Narrowingを指定しない限り、変換演算子に必要です。 この演算子プロシージャが 拡大 変換を定義することを示します。 このヘルプ ページの「拡大変換と縮小変換」を参照してください。
Narrowing
Wideningを指定しない限り、変換演算子に必要です。 この演算子プロシージャが 縮小 変換を定義することを示します。 このヘルプ ページの「拡大変換と縮小変換」を参照してください。
operatorsymbol
必須。 この演算子プロシージャが定義する演算子のシンボルまたは識別子。
operand1
必須。 単項演算子 (変換演算子を含む) の単一オペランドの名前と型、または二項演算子の左オペランド。
operand2
二項演算子に必要です。 二項演算子の右オペランドの名前と型。
operand1 および operand2 には、次の構文と部分があります。
[ ByVal ] operandname [ As operandtype ]
| 部分 | 説明 |
|---|---|
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
データ型の制限
定義するすべての演算子には、定義するクラスまたは構造体が含まれている必要があります。 つまり、クラスまたは構造体は、次のデータ型として表示される必要があります。
単項演算子のオペランド。
2 項演算子のオペランドの少なくとも 1 つ。
変換演算子のオペランドまたは戻り値の型。
特定の演算子には、次のような追加のデータ型制限があります。
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型の有効な値を常に返す必要があります。考えられるすべての例外とその他のエラー条件を処理する必要があります。
呼び出すプロシージャから返されたエラーを処理する必要があります。
変換プロシージャが成功しない可能性がある場合、またはハンドルされない例外が発生する可能性がある場合は、 Narrowing宣言する必要があります。
例
次のコード例では、 Operator ステートメントを使用して、 And、 Or、 IsFalse、および IsTrue 演算子の演算子プロシージャを含む構造体のアウトラインを定義します。
And
Orは、それぞれabc型と戻り値の型abcの 2 つのオペランドを受け取ります。
IsFalse 各 IsTrue は、 abc 型の単一オペランドを受け取り、 Booleanを返します。 これらの定義により、呼び出し元のコードは、abc型のオペランドでAnd、AndAlso、Or、およびOrElseを使用できます。
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
こちらも参照ください
.NET