Compartilhar via


Instrução operator

Declara o símbolo do operador, os operandos e o 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. Consulte a Lista de Atributos.

Public
Obrigatório Indica que esse procedimento de operador tem acesso público .

Overloads
Opcional. Veja sobrecargas.

Shared
Obrigatório Indica que esse procedimento de operador é um procedimento compartilhado .

Shadows
Opcional. Veja 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 ampliação . Consulte "Ampliando e restringindo conversões" nesta página de Ajuda.

Narrowing
Necessário para um operador de conversão, a menos que você especifique Widening. Indica que este procedimento de operador define uma conversão de estreitamento . Consulte "Ampliando e restringindo conversões" nesta página de Ajuda.

operatorsymbol
Obrigatório O símbolo ou identificador do operador que este procedimento de operador define.

operand1
Obrigatório 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 tenha a seguinte sintaxe e partes:

[ ByVal ] operandname [ As operandtype ]

Parte Descrição
ByVal Opcional, mas o mecanismo de passagem deve ser ByVal.
operandname Obrigatório Nome da variável que representa este operando. Consulte 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 retornado pelo procedimento do operador.

statements
Opcional. Bloco de instruções que o procedimento do operador executa.

returnvalue
Obrigatório O valor que o procedimento do operador retorna para o código de chamada.

End Operator
Obrigatório Encerra a definição deste procedimento de operador.

Observações

Você só pode usar Operator em uma classe ou estrutura. Isso significa que o contexto de declaração de 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, Optionalou 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 Return instrução e ela deve especificar um valor. Qualquer número de Return instruções pode aparecer em qualquer lugar no procedimento.

Definir um operador dessa forma é chamado de sobrecarga de operador, quer você use ou não a Overloads palavra-chave. A tabela a seguir lista os operadores que você pode definir.

Tipo Operadores
Unário +, -, IsFalse, , IsTrueNot
Binário +, -, *, /, \, , &, ^, , >>, <<, =, <>>, >=, <, , <=, AndLike, Mod, , OrXor
Conversão (unário) CType

Observe que o = operador na lista binária é o operador de comparação, não o operador de atribuição.

Quando você define CType, você deve especificar um Widening ou Narrowing.

Pares correspondentes

Você deve definir determinados operadores como pares correspondentes. Se você definir um dos operadores desse par, também deverá definir o outro. Os pares correspondentes são os seguintes:

  • = e <>

  • > e <

  • >= e <=

  • IsTrue e IsFalse

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 de tipo de dados adicionais, da seguinte maneira:

  • Se você definir os operadores e IsFalse os IsTrue operadores, ambos deverão retornar o Boolean tipo.

  • Se você definir os operadores e os << operadores, ambos deverão especificar o Integer tipo de operandtypeoperand2.>>

O tipo de retorno não precisa corresponder ao tipo de operando. 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 Andoperadores e os XorOrNotoperadores 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 sua operação bit a bit.

Você não pode definir o AndAlso operador diretamente com uma instrução Operator . No entanto, você poderá usar AndAlso se tiver cumprido as seguintes condições:

  • Você definiu And os mesmos tipos de operando para os quais deseja usar AndAlso.

  • Sua definição de And retorna o mesmo tipo que a classe ou estrutura na qual você a definiu.

  • Você definiu o IsFalse operador na classe ou estrutura na qual você definiu And.

Da mesma forma, você poderá 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 ampliaçã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 sendo 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 lidar com todas as exceções possíveis e outras condições de erro.

  • Ele deve lidar com qualquer retorno de erro 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 Operator instrução para definir a estrutura de uma estrutura que inclui procedimentos de operador para operadores Ande IsTrueOrIsFalseoperadores. And e Or cada um usa dois operandos do tipo abc e do tipo abcde retorno. IsFalse e IsTrue cada um pega um único operando do tipo abc e retorna Boolean. Essas definições permitem que o código de chamada use And, AndAlsoOre 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

Consulte também