Operator Statement

Déclare le symbole, les opérandes et le code qui définissent une procédure d’opérateur dans une classe ou une structure.

Syntaxe

[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
    [ statements ]
    [ statements ]
    Return returnvalue
    [ statements ]
End Operator

Éléments

attrlist
Optionnel. Consultez la Liste des attributs.

Public
Obligatoire. Indique que cette procédure d’opérateur dispose d’un accès public.

Overloads
Optionnel. Voir Surcharges.

Shared
Obligatoire. Indique que cette procédure d’opérateur est une procédure partagée.

Shadows
Optionnel. Consultez Shadows.

Widening
Obligatoire pour un opérateur de conversion, sauf si vous spécifiez Narrowing. Indique que cette procédure d’opérateur définit une conversion étendue. Consultez « Conversions restrictives et étendues » sur cette page d’aide.

Narrowing
Obligatoire pour un opérateur de conversion, sauf si vous spécifiez Widening. Indique que cette procédure d’opérateur définit une conversion restrictive. Consultez « Conversions restrictives et étendues » sur cette page d’aide.

operatorsymbol
Obligatoire. Symbole ou identificateur de l’opérateur défini par cette procédure d’opérateur.

operand1
Obligatoire. Nom et type de l’opérande unique d’un opérateur unaire (y compris un opérateur de conversion) ou de l’opérande gauche d’un opérateur binaire.

operand2
Obligatoire pour les opérateurs binaires. Nom et type de l’opérande droit d’un opérateur binaire.

operand1 et operand2 emploient la syntaxe et les éléments suivants :

[ ByVal ] operandname [ As operandtype ]

Élément Description
ByVal Facultatif, mais le mécanisme de passage doit être ByVal.
operandname Obligatoire. Nom de la variable représentant cet opérande. Consultez Declared Element Names.
operandtype Facultatif, sauf si Option Strict a la valeur On. Type de données de cet opérande.

type
Facultatif, sauf si Option Strict a la valeur On. Type de données de la valeur retournée par la procédure d’opérateur.

statements
Optionnel. Bloc d’instructions exécutées par l’opérateur.

returnvalue
Obligatoire. Valeur que la procédure d’opérateur retourne au code appelant.

End Operator
Obligatoire. Met fin à la définition de cette procédure d’opérateur.

Notes

Vous pouvez utiliser Operator uniquement dans une classe ou une structure. Cela signifie que le contexte de déclaration pour un opérateur ne peut pas être un fichier source, un espace de noms, un module, une interface, une procédure ou un bloc. Pour plus d’informations, consultez Contextes de déclaration et niveaux d’accès par défaut.

Tous les opérateurs doivent être Public Shared. Vous ne pouvez pas spécifier ByRef, Optional ou ParamArray pour l’un des opérandes.

Vous ne pouvez pas utiliser le symbole ou l’identificateur de l’opérateur pour contenir une valeur de retour. Vous devez utiliser l’instruction Return et spécifier une valeur. Un nombre quelconque d’instructions Return peut apparaître n’importe où dans la procédure.

La définition d’un opérateur de cette façon est appelée surcharge d’opérateur, que vous utilisiez ou non le mot clé Overloads. Le tableau suivant présente les opérateurs que vous pouvez définir.

Type Opérateurs
Unaire +, -, IsFalse, IsTrue, Not
Binaire +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor
Conversion (unaire) CType

Notez que l’opérateur = dans la liste binaire est l’opérateur de comparaison, et non l’opérateur d’assignation.

Lorsque vous définissez CType, vous devez spécifier Widening ou Narrowing.

Paires correspondantes

Vous devez définir certains opérateurs en tant que paires correspondantes. Si vous définissez l’un des opérateurs d’une telle paire, vous devez également définir l’autre. Les paires correspondantes sont les suivantes :

  • = et <>

  • > et <

  • >= et <=

  • IsTrue et IsFalse

Restrictions des types de données

Chaque opérateur que vous définissez doit impliquer la classe ou la structure sur laquelle vous le définissez. Cela signifie que la classe ou la structure doit apparaître en tant que type de données des éléments suivants :

  • Opérande d’un opérateur unaire.

  • Au moins l’un des opérandes d’un opérateur binaire.

  • Opérande ou type de retour d’un opérateur de conversion.

Certains opérateurs ont des restrictions de type de données supplémentaires, comme suit :

  • Si vous définissez les opérateurs IsTrue et IsFalse, ils doivent tous deux retourner le type Boolean.

  • Si vous définissez les opérateurs << et >>, ils doivent tous deux spécifier le type Integer pour le operandtype de operand2.

Le type de retour n’a pas besoin de correspondre au type de l’un des opérandes. Par exemple, un opérateur de comparaison tel que = ou <> peut retourner Boolean même si aucun opérande n’est Boolean.

Opérateurs de bits et opérateurs logiques

Les opérateurs And, Or, Not et Xor peuvent effectuer des opérations logiques ou au niveau du bit dans Visual Basic. Toutefois, si vous définissez l’un de ces opérateurs sur une classe ou une structure, vous pouvez ne définir son opération qu’au niveau du bit.

Vous ne pouvez pas définir l’opérateur AndAlso directement avec une instruction Operator. Toutefois, vous pouvez utiliser AndAlso si vous avez rempli les conditions suivantes :

  • Vous avez défini And sur les mêmes types d’opérandes que vous souhaitez utiliser pour AndAlso.

  • Votre définition de And retourne le même type que la classe ou la structure sur laquelle vous l’avez définie.

  • Vous avez défini l’opérateur IsFalse sur la classe ou la structure sur laquelle vous avez défini And.

De même, vous pouvez utiliser OrElse si vous avez défini Or sur les mêmes opérandes, avec le type de retour de la classe ou de la structure, et que vous avez défini IsTrue sur la classe ou la structure.

Widening and Narrowing Conversions

Une conversion étendue réussit toujours au moment de l’exécution, tandis qu’une conversion restrictive peut échouer au moment de l’exécution. Pour plus d’informations, consultez Widening and Narrowing Conversions.

Si vous déclarez une procédure de conversion comme Widening, votre code de procédure ne doit pas générer d’échecs. Cela signifie :

  • Elle doit toujours retourner une valeur valide de type type.

  • Elle doit gérer toutes les exceptions possibles et d’autres conditions d’erreur.

  • Elle doit gérer les retours d’erreur de toutes les procédures qu’elle appelle.

S’il est possible qu’une procédure de conversion échoue ou qu’elle provoque une exception non gérée, vous devez la déclarer comme Narrowing.

Exemple

L’exemple de code suivant utilise l’instruction Operator pour définir le contour d’une structure qui inclut des procédures d’opérateur pour les opérateurs And, Or, IsFalse et IsTrue. And et Or prennent chacun deux opérandes de type abc et de type de retour abc. IsFalse et IsTrue prennent chacun un opérande unique de type abc et retournent Boolean. Ces définitions permettent au code appelant d’utiliser And, AndAlso, Or et OrElse avec des opérandes de type 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

Voir aussi