Condividi tramite


Istruzione Operator

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
Opzionale. Vedere Elenco attributi.

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

Overloads
Opzionale. Vedere Overload.

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

Shadows
Opzionale. Vedi Ombre.

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 ]

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

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

statements
Opzionale. 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 di dichiarazione e livelli di accesso predefiniti.

Tutti gli operatori devono essere Public Shared. Non è possibile specificare ByRef, Optionalo 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 Return istruzioni può essere visualizzato in qualsiasi punto della routine.

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 . Nella tabella seguente sono elencati gli operatori che è possibile definire.

TIPO Operatori
Unario +, -, IsFalse, IsTrueNot
Binario +, -, , */, \&^>><<=<>>>=<<=AndLike, ModOrXor
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 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 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 IsTrue operatori e IsFalse , devono restituire entrambi il Boolean tipo.

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

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 Andoperatori , NotOr, 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:

  • Sono stati definiti And gli stessi tipi di operando da usare per AndAlso.

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

  • L'operatore IsFalse è stato definito 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 ed è stato definito IsTrue nella classe o nella struttura .

Conversioni di allargamento e restringimento

Una conversione verso un tipo di dati più grande ha sempre esito positivo in fase di esecuzione, mentre una conversione verso un tipo di dati più piccolo può avere esito negativo in fase di esecuzione. Per altre informazioni, vedere Conversioni di tipo Widening and Narrowing.

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 la struttura di una struttura che include procedure di operatore per gli Andoperatori , OrIsFalse, e IsTrue . And e Or ognuno accetta due operandi di tipo abc e tipo abcrestituito . IsFalse e IsTrue ognuno accetta un singolo operando di tipo abc e restituisce Boolean. Queste definizioni consentono al codice chiamante di usare And, AndAlsoOr, 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

Vedere anche