Operator Statement

Dichiara il simbolo dell'operatore, gli operandi e il codice che definiscono una routine dell'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 routine dell'operatore ha accesso Pubblico.

Overloads
facoltativo. Vedere Overload .

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

Shadows
facoltativo. Vedere Ombreggiature.

Widening
Obbligatorio per un operatore di conversione a meno che non si specifica Narrowing . Indica che questa routine dell'operatore definisce una conversione widening. Vedere "Widening and Narrowing Conversions" in questa pagina della Guida.

Narrowing
Obbligatorio per un operatore di conversione a meno che non si specifica Widening . Indica che questa routine dell'operatore definisce una conversione verso un tipo narrowing. Vedere "Widening and Narrowing Conversions" in questa pagina della Guida.

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

operand1
Obbligatorio. Nome e tipo del singolo operando di un operatore unario (incluso un operatore di conversione) o dell'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 Declared Element Names.
operandtype Facoltativo a meno Option Strict che non sia On . Tipo di dati di questo operando.

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

statements
facoltativo. Blocco di istruzioni eseguito 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.

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

Non è possibile usare il simbolo dell'operatore o l'identificatore per contenere un valore restituito. È necessario usare Return l'istruzione 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 è detta overload dell'operatore, indipendentemente dal fatto che si usi o meno la Overloads parola chiave . La tabella seguente elenca gli operatori che è possibile definire.

Tipo 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 o Widening Narrowing .

Coppie corrispondenti

È necessario definire determinati operatori come coppie corrispondenti. Se si definisce uno degli operatori di una coppia di questo tipo, è necessario definire anche l'altro. Le coppie corrispondenti sono le seguenti:

  • = e <>

  • > e <

  • >= e <=

  • IsTrue e IsFalse

Restrizioni relative al tipo di dati

Ogni operatore definito deve includere la classe o la struttura in cui viene definito. Ciò significa che la classe o la struttura deve essere visualizzata come tipo di dati di quanto segue:

  • Operando di un operatore unario.

  • Almeno uno degli operandi di un operatore binario.

  • Operando o tipo restituito di un operatore di conversione.

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

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

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

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

Operatori logici e bit per bit

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

Non è possibile definire AndAlso l'operatore direttamente con Operator un'istruzione . 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 restituisce lo stesso tipo della classe o della struttura And in cui è stata definita.

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

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

Widening and Narrowing Conversions

Una conversione di tipo widening ha sempre esito positivo in fase di esecuzione, mentre una conversione verso un tipo di dati più ridotto 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 procedura 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 eventuali errori restituiti da qualsiasi routine che chiama.

Se è possibile che una procedura 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 per definire la struttura di una struttura che include le procedure degli operatori per gli operatori Operator And , , e Or IsFalse IsTrue . And e Or accettano due operandi di tipo abc e di tipo restituito abc . IsFalse e IsTrue accettano un singolo operando di tipo abc e restituiscono Boolean . Queste definizioni consentono al codice chiamante di And usare , , e con AndAlso Or OrElse 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