Operator Statement

Declara el símbolo del operador, los operandos y el código que definen un procedimiento de operador en una clase o estructura.

Sintaxis

[ <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 Lista de atributos.

Public
Necesario. Indica que este procedimiento de operador tiene acceso público.

Overloads
Opcional. Consulte Overloads.

Shared
Necesario. Indica que este procedimiento de operador es un procedimiento compartido.

Shadows
Opcional. Consulte Shadows.

Widening
Obligatorio para un operador de conversión a menos que especifique Narrowing. Indica que este procedimiento de operador define una conversión de ampliación. Consulte "Conversiones de ampliación y conversiones de restricción" en esta página de ayuda.

Narrowing
Obligatorio para un operador de conversión a menos que especifique Widening. Indica que este procedimiento de operador define una conversión de restricción. Consulte "Conversiones de ampliación y conversiones de restricción" en esta página de ayuda.

operatorsymbol
Necesario. Símbolo o identificador del operador que este procedimiento de operador define.

operand1
Necesario. Nombre y tipo del operando único de un operador unario (incluido un operador de conversión) o el operando izquierdo de un operador binario.

operand2
Obligatorio para operadores binarios. Nombre y tipo del operando derecho de un operador binario.

operand1 y operand2 tienen la sintaxis y partes siguientes:

[ ByVal ] operandname [ As operandtype ]

Parte Descripción
ByVal Opcional, pero el mecanismo de paso debe ser ByVal.
operandname Necesario. Nombre de la variable que representa este operando. Vea Declared Element Names.
operandtype Opcional, a menos que Option Strict sea On. Tipo de datos de este operando.

type
Opcional, a menos que Option Strict sea On. Tipo de datos del valor que el procedimiento de operador devuelve.

statements
Opcional. Bloque de instrucciones que el procedimiento de operador ejecuta.

returnvalue
Necesario. Valor que el procedimiento de operador devuelve al código de llamada.

End Operator
Necesario. Finaliza la definición de este procedimiento de operador.

Comentarios

Solo puede usar Operator en una clase o estructura. Esto significa que el contexto de declaración de un operador no puede ser un archivo de código fuente, un espacio de nombres, un módulo, una interfaz, un procedimiento ni un bloque. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).

Todos los operadores deben ser Public Shared. No puede especificar ByRef, Optional ni ParamArray para ninguno de los operandos.

No puede usar el identificador ni el símbolo del operador para contener un valor devuelto. Debe usar la instrucción Return, la que debe especificar un valor. Cualquier número de instrucciones Return puede aparecer en cualquier parte del procedimiento.

Definir un operador de este modo se denomina sobrecarga de operador, independientemente de si se usa o no la palabra clave Overloads. En la tabla siguiente se enumeran los operadores que se pueden definir.

Tipo Operadores
Unario +, -, IsFalse, IsTrue, Not
Binary +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor
Conversión (unaria) CType

Tenga en cuenta que el operador = de la lista binaria es el operador de comparación, no el de asignación.

Al definir CType, debe especificar Widening o Narrowing.

Pares coincidentes

Debe definir determinados operadores como pares coincidentes. Si define cualquiera de los operadores de este tipo de par, también debe definir el otro. Los pares coincidentes son los siguientes:

  • = y <>

  • > y <

  • >= y <=

  • IsTrue y IsFalse

Restricciones de tipos de datos

Cada operador que defina debe implicar la clase o estructura en la que se define. Esto significa que la clase o estructura debe aparecer como el tipo de datos de lo siguiente:

  • El operando de un operador unario.

  • Al menos uno de los operandos de un operador binario.

  • El operando o el tipo de valor devuelto de un operador de conversión.

Algunos operadores tienen restricciones de tipo de datos adicionales, como se indica a continuación:

  • Si define los operadores IsTrue y IsFalse, ambos deben devolver el tipo Boolean.

  • Si define los operadores << y >>, ambos deben especificar el tipo Integer para operandtype de operand2.

No es necesario que el tipo de valor devuelto corresponda al tipo de ninguno de los operandos. Por ejemplo, un operador de comparación como = o <> puede devolver Boolean, incluso si ninguno de los operandos es Boolean.

Operadores lógicos y bit a bit

Los operadores And, Or, Not y Xor pueden realizar operaciones lógicas o bit a bit en Visual Basic. Sin embargo, si define uno de estos operadores en una clase o estructura, solo puede definir su operación bit a bit.

No puede definir el operador AndAlso directamente con una instrucción Operator. Sin embargo, puede usar AndAlso si ha cumplido estas condiciones:

  • Definió And en los mismos tipos de operando que desea usar para AndAlso.

  • La definición de And devuelve el mismo tipo que la clase o estructura en la que se definió.

  • Definió el operador IsFalse en la clase o estructura en la que definió And.

Del mismo modo, puede usar OrElse si definió Or en los mismos operandos, con el tipo de valor devuelto de la clase o estructura, y definió IsTrue en la clase o estructura.

Widening and Narrowing Conversions

Una conversión de ampliación siempre se realiza correctamente en tiempo de ejecución, mientras que una conversión de restricción puede generar un error en tiempo de ejecución. Para obtener más información, consulta Widening and Narrowing Conversions.

Si declara un procedimiento de conversión como Widening, el código del procedimiento no debe generar errores. Esto significa lo siguiente:

  • Siempre debe devolver un valor válido de tipo type.

  • Debe controlar todas las excepciones posibles y otras condiciones de error.

  • Debe controlar cualquier devolución de error de los procedimientos a los que llama.

Si existe alguna posibilidad de que un procedimiento de conversión no se realice correctamente o que pueda provocar una excepción no controlada, debe declararlo como Narrowing.

Ejemplo

En el ejemplo de código siguiente, se usa la instrucción Operator para definir el esquema de una estructura que incluye procedimientos de operador para los operadores And, Or, IsFalse y IsTrue. And y Or toman cada uno dos operandos de tipo abc y devuelven el tipo abc. IsFalse y IsTrue toman cada uno un operando único de tipo abc y devuelven Boolean. Estas definiciones permiten que el código de llamada utilice And, AndAlso, Or y OrElse con operandos de 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 también