Operator Statement

Dichiara il simbolo dell'operatore, gli operandi e il codice che definiscono una routine operatore in una classe o struttura.

Sintassi

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

Parti

attrlist
facoltativo. Vedere Elenco attributi.

Public
Obbligatorio. Indica che questa procedura dell'operatore ha accesso pubblico .

Overloads
facoltativo. Vedere Overload.

Shared
Obbligatorio. Indica che questa procedura operatore è una procedura condivisa .

Shadows
facoltativo. Vedere Ombreggiatura.

Widening
Obbligatorio per un operatore di conversione, a meno che non si specifica Narrowing. Indica che questa procedura dell'operatore definisce una conversione di estensione . Vedere "Estensione e riduzione delle conversioni" in questa pagina della Guida.

Narrowing
Obbligatorio per un operatore di conversione, a meno che non si specifica Widening. Indica che questa procedura dell'operatore definisce una conversione Di stretta . Vedere "Estensione e riduzione delle conversioni" in questa pagina della Guida.

operatorsymbol
Obbligatorio. Simbolo o identificatore dell'operatore definito dalla routine dell'operatore.

operand1
Obbligatorio. Nome e tipo dell'operando singolo di un operatore unario (incluso un operatore di conversione) o l'operando sinistro di un operatore binario.

operand2
Obbligatorio per gli operatori binari. Nome e tipo dell'operando destro di un operatore binario.

operand1 e avere la sintassi e operand2 le parti seguenti:

[ ByVal ] operandname [ As operandtype ]

Parte Descrizione
ByVal Facoltativo, ma il meccanismo di passaggio deve essere ByVal.
operandname Obbligatorio. Nome della variabile che rappresenta questo operando. Vedere Declared Element Names.
operandtype Facoltativo, a meno che Option Strict non sia On. Tipo di dati di questo operando.

type
Facoltativo, a meno che Option Strict non sia On. Tipo di dati del valore restituito dalla routine dell'operatore.

statements
facoltativo. Blocco di istruzioni eseguite dalla routine dell'operatore.

returnvalue
Obbligatorio. Valore restituito dalla routine dell'operatore al codice chiamante.

End Operator
Obbligatorio. Termina la definizione di questa procedura dell'operatore.

Commenti

È possibile usare Operator solo in una classe o in una struttura. Ciò significa che il contesto di dichiarazione per un operatore non può essere un file di origine, uno spazio dei nomi, un modulo, un'interfaccia, una routine o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Tutti gli operatori devono essere Public Shared. Non è possibile specificare ByRef, Optionalo ParamArray per uno degli operandi.

Non è possibile usare il simbolo dell'operatore o l'identificatore per contenere un valore restituito. È necessario usare l'istruzione Return e deve specificare un valore. Qualsiasi numero di Return istruzioni può essere visualizzato ovunque nella procedura.

La definizione di un operatore in questo modo viene chiamata overload dell'operatore, indipendentemente dal fatto che si usi o meno la Overloads parola chiave. La tabella seguente elenca gli operatori che è possibile definire.

Type Operatori
Unario +, -, IsFalse, IsTrue, Not
Binary +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor
Conversione (unario) CType

Si noti che l'operatore = nell'elenco binario è l'operatore di confronto, non l'operatore di assegnazione.

Quando si definisce CType, è necessario specificare Widening o Narrowing.

Coppie corrispondenti

È necessario definire determinati operatori come coppie corrispondenti. Se si definisce un operatore di tale coppia, è necessario definire anche l'altro. Le coppie corrispondenti sono le seguenti:

  • = e <>

  • > e <

  • >= e <=

  • IsTrue e IsFalse

Restrizioni del tipo di dati

Ogni operatore definito deve coinvolgere la classe o la struttura in cui viene definita. Ciò significa che la classe o la struttura devono essere visualizzate come tipo di dati del seguente:

  • Operando di un operatore unario.

  • Almeno uno degli operandi di un operatore binario.

  • Operando o il tipo restituito di un operatore di conversione.

Alcuni operatori hanno restrizioni aggiuntive per il tipo di dati, come indicato di seguito:

  • Se si definiscono gli IsTrue operatori e IsFalse , devono restituire entrambi il Boolean tipo.

  • Se si definiscono gli << operatori e>>, devono specificare entrambi il Integer tipo per .operand2operandtype

Il tipo restituito non deve corrispondere al tipo di operando. Ad esempio, un operatore di confronto, ad = esempio o <> può restituire Boolean anche se nessun operando è Boolean.

Operatori logici e bit per bit

Gli Andoperatori , , OrNote Xor possono eseguire operazioni logiche o bit per bit in Visual Basic. Tuttavia, se si definisce uno di questi operatori in una classe o una struttura, è possibile definire solo l'operazione bit per bit.

Non è possibile definire l'operatore direttamente con un'istruzione AndAlsoOperator . Tuttavia, è possibile usare AndAlso se sono state soddisfatte le condizioni seguenti:

  • È stato definito And negli stessi tipi operandi da usare per AndAlso.

  • La definizione di And restituisce lo stesso tipo della classe o della struttura in cui è stata definita.

  • È stato definito l'operatore IsFalse nella classe o nella struttura in cui è stato definito And.

Analogamente, è possibile usare OrElse se sono stati definiti Or negli stessi operandi, con il tipo restituito della classe o della struttura e si è definito IsTrue nella classe o nella struttura.

Widening and Narrowing Conversions

Una conversione estesa ha sempre esito positivo in fase di esecuzione, mentre una conversione ristretta può avere esito negativo in fase di esecuzione. Per altre informazioni, vedere Widening and Narrowing Conversions.

Se si dichiara una routine di conversione come Widening, il codice della routine non deve generare errori. Ciò comporta quanto segue:

  • Deve sempre restituire un valore valido di tipo type.

  • Deve gestire tutte le possibili eccezioni e altre condizioni di errore.

  • Deve gestire qualsiasi errore restituito da tutte le procedure chiamate.

Se è possibile che una procedura di conversione non sia riuscita o che potrebbe causare un'eccezione non gestita, è necessario dichiararla come Narrowing.

Esempio

Nell'esempio di codice seguente viene utilizzata l'istruzione Operator per definire la struttura di una struttura che include le procedure degli operatori per gli Andoperatori , Or, IsFalsee IsTrue . And e Or ognuno accetta due operandi di tipo abc e tipo abcrestituito . IsFalse e IsTrue ogni accetta un singolo operando di tipo abc e restituisce Boolean. Queste definizioni consentono al codice chiamante di usare And, AndAlso, Ore OrElse con operandi di tipo 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

Vedi anche