Operator Statement

Deklariert das Operatorsymbol, die Operanden und den Code zum Definieren einer Operatorprozedur für eine Klasse oder eine Struktur.

Syntax

[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
    [ statements ]
    [ statements ]
    Return returnvalue
    [ statements ]
End Operator

Bestandteile

attrlist
Optional. Siehe Attributliste.

Public
Erforderlich. Gibt an, dass diese Operatorprozedur Public Zugriff hat.

Overloads
Optional. Siehe Überladungen.

Shared
Erforderlich. Gibt an, dass diese Operatorprozedur eine Shared Prozedur ist.

Shadows
Optional. Siehe Shadows.

Widening
Erforderlich für einen Konvertierungsoperator, es sei denn, Sie legen Narrowing fest. Gibt an, dass diese Operatorprozedur eine erweiternde Konvertierung definiert. Siehe „Erweiternde und eingrenzende Konvertierungen“ auf dieser Hilfe-Website.

Narrowing
Bei einem Konvertierungsoperator erforderlich, es sei denn, Sie legen Widening fest. Gibt an, dass diese Operatorprozedur eine einschränkende Konvertierung definiert. Siehe „Erweiternde und eingrenzende Konvertierungen“ auf dieser Hilfe-Website.

operatorsymbol
Erforderlich. Das Symbol oder der Bezeichner des Operators, der durch diese Operatorprozedur definiert wird.

operand1
Erforderlich. Der Name und der Typ des einzelnen Operanden eines unären Operators (einschließlich eines Konvertierungsoperators) oder der linke Operand eines binären Operators.

operand2
Bei binären Operatoren erforderlich. Der Name und der Typ des linken Operanden eines binären Operators.

operand1 und operand2 haben die folgende Syntax und die folgenden Bestandteile:

[ ByVal ] operandname [ As operandtype ]

Teil Beschreibung
ByVal Optional, aber der Übergabemechanismus muss ByVal sein.
operandname Erforderlich. Name der Variablen, die für diesen Operanden steht. Siehe Declared Element Names.
operandtype Optional, außer für Option Strict ist On festgelegt. Datentyp dieses Operanden.

type
Optional, außer für Option Strict ist On festgelegt. Datentyp des Werts, den die Operatorprozedur zurückgibt.

statements
Optional. Block von Anweisungen, die von der Operatorprozedur ausgeführt werden.

returnvalue
Erforderlich. Der Wert, den die Operatorprozedur an den aufrufenden Code zurückgibt.

End Operator
Erforderlich. Beendet die Definition dieser Operatorprozedur.

Bemerkungen

Sie können Operator nur in einer Klasse oder Struktur verwenden. Daher kann der Deklarationskontext eines Operators keine Quelldatei, kein Namespace, kein Modul, keine Schnittstelle, keine Prozedur und kein Block sein. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

Alle Operatoren müssen Public Shared sein. Sie können für keinen der beiden Operanden ByRef, Optional oder ParamArray festlegen.

Das Symbol oder der Bezeichner des Operators kann keinen Rückgabewert enthalten. Sie müssen die Return-Anweisung verwenden, und sie muss einen Wert festlegen. Die Prozedur kann beliebig viele Return-Anweisungen an jeder beliebigen Stelle enthalten.

Die derartige Definition eines Operators wird als Operatorüberladung bezeichnet, unabhängig davon, ob Sie das Schlüsselwort Overloads verwenden oder nicht. In der folgenden Tabelle sind die Operatoren aufgelistet, die Sie definieren können.

type Operatoren
Unär +, -, IsFalse, IsTrue, Not
Binär +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor
Konvertierung (unär) CType

Beachten Sie, dass der Operator = in der binären Liste der Vergleichsoperator ist und nicht der Zuweisungsoperator.

Bei der Definition von CType müssen Sie entweder Widening oder Narrowing angeben.

Übereinstimmende Paare

Sie müssen bestimmte Operatoren als übereinstimmende Paare definieren. Wenn Sie einen Operator eines solchen Paares definieren, müssen Sie den anderen ebenfalls definieren. Die übereinstimmenden Paare sind:

  • = und <>

  • > und <

  • >= und <=

  • IsTrue und IsFalse

Datentypeinschränkungen

Jeder definierte Operator muss die Klasse oder Struktur einbeziehen, in der Sie ihn definieren. Die Klasse oder Struktur muss dementsprechend als Datentyp für Folgendes angegeben sein:

  • den Operanden eines unären Operators

  • mindestens einen der Operanden eines binären Operators

  • den Operanden oder den Rückgabetyp eines Konvertierungsoperators

Bei bestimmten Operatoren gelten zusätzliche Datentypbeschränkungen:

  • Wenn Sie die Operatoren IsTrue und IsFalse definieren, müssen beide den Typ Boolean zurückgeben.

  • Wenn Sie die Operatoren << und >> definieren, müssen beide den Typ Integer für den operandtype von operand2 angeben.

Der Rückgabetyp muss nicht dem Typ der beiden Operanden entsprechen. Beispielsweise kann ein Vergleichsoperator wie = oder <> auch dann Boolean zurückgeben, wenn keiner der beiden Operanden Boolean ist.

Logische und bitweise Operatoren

Die Operatoren And, Or, Not und Xor können logische oder bitweise Operationen in Visual Basic ausführen. Wenn Sie jedoch einen dieser Operatoren in einer Klasse oder Struktur definieren, können Sie nur seine bitweise Operation definieren.

Den Operator AndAlso können Sie nicht direkt mit einer Operator-Anweisung definieren. Sie können allerdings AndAlso verwenden, sofern die folgenden Bedingungen erfüllt sind:

  • Sie haben für dieselben Operandentypen, die Sie für AndAlso verwenden möchten, And definiert.

  • Ihre Definition von And gibt denselben Typ zurück wie die Klasse oder Struktur, in der Sie ihn definiert haben.

  • Sie haben den Operator IsFalse in der Klasse oder Struktur definiert, in der Sie And definiert haben.

Ebenso können Sie OrElse verwenden, wenn Sie Or auf denselben Operanden mit dem Rückgabetyp der Klasse oder Struktur und IsTrue in der Klasse oder Struktur definiert haben.

Widening and Narrowing Conversions

Eine erweiternde Konvertierung ist zur Laufzeit immer erfolgreich, während eine einschränkende Konvertierung zur Laufzeit fehlschlagen kann. Weitere Informationen finden Sie unter Widening and Narrowing Conversions.

Wenn Sie eine Konvertierungsprozedur als Widening deklarieren, darf der Prozedurcode keine Fehler erzeugen. Dies bedeutet Folgendes:

  • Er muss immer einen gültigen Wert des Typs type zurückgeben.

  • Er muss alle möglichen Ausnahmen und sonstigen Fehlerbedingungen verarbeiten können.

  • Er muss alle Fehlerrückgaben von allen aufgerufenen Prozeduren verarbeiten können.

Selbst wenn nur die geringe Wahrscheinlichkeit besteht, dass eine Konvertierungsprozedur fehlschlägt oder zu einem Ausnahmefehler führt, müssen Sie sie als Narrowing deklarieren.

Beispiel

Im folgenden Codebeispiel wird mit der Operator-Anweisung die Gliederung einer Struktur definiert, die die Operatorprozeduren für die Operatoren And, Or, IsFalse und IsTrue enthält. And und Or verwenden jeweils zwei Operanden des Typs abc und geben Typ abc zurück. IsFalse und IsTrue verwenden jeweils einen einzelnen Operanden des Typs abc und geben Boolean zurück. Mit diesen Definitionen kann der aufrufende Code And, AndAlso, Or und OrElse mit Operanden des Typs abc verwenden.

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

Siehe auch