Istruzione Operator

Dichiara il simbolo dell'operatore, gli operandi e il codice che definiscono una routine di operatore in una classe o una 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 degli attributi.

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

Overloads
Facoltativo. Vedere Overload.

Shared
Obbligatorio. Indica che questa routine dell'operatore è una routine Shared.

Shadows
Facoltativo. Vedere Shadows.

Widening
Obbligatorio per un operatore di conversione a meno che non si specifichi Narrowing. Indica che questa routine dell'operatore definisce una conversione Widening. Vedere "Conversioni verso l'estensione e la riduzione" in questa pagina della Guida.

Narrowing
Obbligatorio per un operatore di conversione a meno che non si specifichi Widening. Indica che questa routine dell'operatore definisce una conversione Narrowing. Vedere "Conversioni verso l'estensione e la riduzione" in questa pagina della Guida.

operatorsymbol
Obbligatorio. Simbolo o identificatore dell'operatore definito da questa routine operatore.

operand1
Obbligatorio. Nome e tipo del singolo operando 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 operand2 hanno la sintassi e le parti seguenti:

[ ByVal ] operandname [ As operandtype ]

In 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 routine dell'operatore.

Osservazioni:

È 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, Optional o ParamArray per uno degli operandi.

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

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

Type Operatori
Unario +, -, IsFalse, IsTrue, Not
Binario +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, 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 abbinate

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

  • = e <>

  • > e <

  • >= e <=

  • IsTrue e IsFalse

Restrizioni relative ai tipi di dati

Ogni operatore definito deve coinvolgere la classe o la struttura in cui viene definita. Ciò significa che la classe o la struttura deve essere visualizzata come tipo di dati degli elementi seguenti:

  • 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 sui tipi di dati, come indicato di seguito:

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

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

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

Operatori logici e bit per bit

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

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

  • Si è definito And sugli stessi tipi di operando da usare per AndAlso.

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

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

Analogamente, è possibile usare OrElse se è stato definito Or negli stessi operandi, con il tipo restituito della classe o della struttura, ed è stato definito IsTrue nella classe o nella struttura.

Widening and Narrowing Conversions

Una conversione che supporta un maggior numero di dati ha sempre esito positivo in fase di esecuzione, mentre una conversione che supporta un minor numero di dati 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 restituire sempre un valore valido di tipo type.

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

  • Deve gestire qualsiasi errore restituito da qualsiasi routine che chiama.

Se è possibile che una routine di conversione non riesca o che possa causare un'eccezione non gestita, è necessario dichiararla come Narrowing.

Esempio

Nell'esempio di codice seguente viene utilizzata l'istruzione Operator per definire il contorno di una struttura che include procedure di operatore per gli operatori And, Or, IsFalse e IsTrue. And e Or accettano ognuno due operandi di tipo abc e tipo restituito abc. IsFalse e IsTrue accettano ognuno un singolo operando di tipo abc e restituiscono Boolean. Queste definizioni consentono al codice chiamante di usare And, AndAlso Or e 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