Instrução Operator
Declara o símbolo do operador, operandos e código que definem um procedimento de operador em uma classe ou estrutura.
Sintaxe
[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
[ statements ]
[ statements ]
Return returnvalue
[ statements ]
End Operator
Partes
attrlist
Opcional. Confira Lista de atributos.
Public
Obrigatórios. Indica que esse procedimento de operador tem acesso Público.
Overloads
Opcional. Confira Sobrecargas.
Shared
Obrigatórios. Indica que esse procedimento de operador é um procedimento compartilhado.
Shadows
Opcional. Confira Sombras.
Widening
Necessário para um operador de conversão, a menos que você especifique Narrowing
. Indica que esse procedimento de operador define uma conversão de expansão. Consulte "Conversões de Expansão e Restrição" nesta página de Ajuda.
Narrowing
Necessário para um operador de conversão, a menos que você especifique Widening
. Indica que esse procedimento de operador define uma conversão de restrição. Consulte "Conversões de Expansão e Restrição" nesta página de Ajuda.
operatorsymbol
Obrigatórios. O símbolo ou identificador do operador definido por este procedimento de operador.
operand1
Obrigatórios. O nome e o tipo do operando único de um operador unário (incluindo um operador de conversão) ou o operando esquerdo de um operador binário.
operand2
Necessário para operadores binários. O nome e o tipo do operando direito de um operador binário.
operand1
e operand2
têm a sintaxe e blocos a seguir:
[ ByVal ] operandname [ As operandtype ]
Parte | Descrição |
---|---|
ByVal |
Opcional, mas o mecanismo de passagem deve ser ByVal. |
operandname |
Obrigatórios. Nome da variável que representa esse operando. Confira Nomes de elementos declarados. |
operandtype |
Opcional a menos que Option Strict seja On . Tipo de dados desse operando. |
type
Opcional a menos que Option Strict
seja On
. Tipo de dados do valor que o procedimento do operador retorna.
statements
Opcional. Bloco de instruções que o procedimento do operador executa.
returnvalue
Obrigatórios. O valor que o procedimento do operador retorna para o código de chamada.
End
Operator
Obrigatórios. Termina a definição deste procedimento de operador.
Comentários
Você só pode usar Operator
em uma classe ou estrutura. Isso significa que o contexto de declaração para um operador não pode ser um arquivo de origem, namespace, módulo, interface, procedimento ou bloco. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.
Todos os operadores devem ser Public Shared
. Você não pode especificar ByRef
, Optional
ou ParamArray
para qualquer operando.
Não é possível usar o símbolo ou o identificador do operador para manter um valor retornado. Você deve usar a instrução Return
e ela deve especificar um valor. Qualquer número de instruções Return
pode aparecer em qualquer lugar do procedimento.
Definir um operador dessa forma é chamado de sobrecarga de operador, se você usa ou não a palavra-chave Overloads
. A tabela a seguir lista os operadores que você pode definir.
Tipo | Operadores |
---|---|
Unário | + , - , IsFalse , IsTrue , Not |
Binário | + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= , < , <= , And , Like , Mod , Or , Xor |
Conversão (unário) | CType |
Observe que o operador =
na lista binária é o operador de comparação, não de atribuição.
Ao definir CType
, você deve especificar um Widening
ou Narrowing
.
Pares correspondentes
Você deve definir determinados operadores como pares correspondentes. Se você definir um operador desse par, também deverá definir o outro. Os pares correspondentes são os seguintes:
=
e<>
>
e<
>=
e<=
IsTrue
eIsFalse
Restrições de tipo de dados
Cada operador definido deve envolver a classe ou a estrutura na qual você a define. Isso significa que a classe ou estrutura deve aparecer como o tipo de dados do seguinte:
O operando de um operador unário.
Pelo menos um dos operandos de um operador binário.
O operando ou o tipo de retorno de um operador de conversão.
Determinados operadores têm restrições adicionais de tipo de dados, da seguinte maneira:
Se você definir os operadores
IsTrue
eIsFalse
, ambos deverão retornar o tipoBoolean
.Se você definir os operadores
<<
e>>
, ambos deverão retornar o tipoInteger
para ooperandtype
deoperand2
.
O tipo de retorno não precisa corresponder ao tipo de nenhum dos operandos. Por exemplo, um operador de comparação como =
ou <>
pode retornar Boolean
mesmo que nenhum operando seja Boolean
.
Operadores lógicos e bit a bit
Os operadores And
, Or
, Not
e Xor
podem executar operações lógicas ou bit a bit no Visual Basic. No entanto, se você definir um desses operadores em uma classe ou estrutura, poderá definir apenas a operação bit a bit.
Você não pode definir o operador AndAlso
diretamente com uma instrução Operator
. No entanto, você poderá usar AndAlso
se tiver cumprido as condições a seguir:
Você definiu
And
com os mesmos tipos de operando que deseja usar paraAndAlso
.Sua definição de
And
retorna o mesmo tipo que a classe ou estrutura na qual você a definiu.Você definiu o operador
IsFalse
na classe ou estrutura na qual você definiuAnd
.
Da mesma forma, você pode usar OrElse
se tiver definido Or
nos mesmos operandos, com o tipo de retorno da classe ou estrutura e tiver definido IsTrue
na classe ou estrutura.
Conversões de Widening e Narrowing
Uma conversão de expansão é sempre bem-sucedida em tempo de execução, enquanto uma conversão de restrição pode falhar em tempo de execução. Para obter mais informações, consulte Ampliando e restringindo conversões.
Se você declarar um procedimento de conversão como Widening
, seu código de procedimento não deverá gerar nenhuma falha. Isso significa o seguinte:
Ele sempre deve retornar um valor válido do tipo
type
.Ele deve tratar todas as exceções possíveis e outras condições de erro.
Deve tratar qualquer erro retornado de todos os procedimentos que ele chama.
Se houver alguma possibilidade de um procedimento de conversão não ter êxito ou que possa causar uma exceção sem tratamento, você deverá declarar que é Narrowing
.
Exemplo
O exemplo de código a seguir usa a instrução Operator
para definir o contorno de uma estrutura que inclui procedimentos de operador para os operadores And
, Or
, IsFalse
e IsTrue
. And
e Or
usam cada um dois operandos do tipo abc
e tipo de retorno abc
. IsFalse
e IsTrue
usam cada um, um operando simples do tipo abc
e tipo de retorno Boolean
. Essas definições permitem que o código de chamada use And
, AndAlso
, Or
e OrElse
com operandos do 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