Partager via


Guide pratique pour déduire les noms et les types de propriétés dans les déclarations de types anonymes (Visual Basic)

Les types anonymes ne fournissent aucun mécanisme pour spécifier directement les types de données des propriétés. Les types de toutes les propriétés sont déduits. Dans l’exemple suivant, les types et NamePrice sont déduits directement des valeurs utilisées pour les initialiser.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Les types anonymes peuvent également déduire des noms de propriétés et des types provenant d’autres sources. Les sections qui suivent fournissent une liste des circonstances dans lesquelles l’inférence est possible et des exemples de situations où ce n’est pas le cas.

Inférence réussie

Les types anonymes peuvent déduire des noms et des types de propriétés à partir des sources suivantes :

  • À partir de noms de variables. Le type anonProduct anonyme aura deux propriétés et productNameproductPrice. Leurs types de données seront ceux des variables d’origine et StringDouble, respectivement.

    Dim productName As String = "paperclips"
    Dim productPrice As Double = 1.29
    Dim anonProduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonProduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • À partir des noms de propriété ou de champ d’autres objets. Par exemple, considérez un car objet d’un CarClass type qui inclut et ID des Name propriétés. Pour créer une instance de type anonyme, car1avec Name et ID des propriétés initialisées avec les valeurs de l’objet car , vous pouvez écrire les éléments suivants :

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    La déclaration précédente équivaut à la ligne de code plus longue qui définit le type car2anonyme .

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • À partir des noms de membres XML.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    Le type obtenu aurait anon une propriété, Bookde type IEnumerable(Of XElement).

  • À partir d’une fonction qui n’a aucun paramètre, par SomeFunction exemple dans l’exemple suivant.

    Dim sc As New SomeClass
    Dim anon1 = New With {Key sc.SomeFunction()}
    

    La variable anon2 dans le code suivant est un type anonyme qui a une propriété, un caractère nommé First. Ce code affiche une lettre « E », la lettre retournée par la fonction First.

    Dim aString As String = "Example String"
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

Échecs d’inférence

L’inférence de nom échoue dans de nombreuses circonstances, notamment :

  • L’inférence dérive de l’appel d’une méthode, d’un constructeur ou d’une propriété paramétrable qui nécessite des arguments. La déclaration précédente d’échec s’il anon1someFunction contient un ou plusieurs arguments.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    L’affectation à un nouveau nom de propriété résout le problème.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • L’inférence dérive d’une expression complexe.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    L’erreur peut être résolue en affectant le résultat de l’expression à un nom de propriété.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • L’inférence pour plusieurs propriétés produit deux propriétés ou plus qui ont le même nom. En faisant référence aux déclarations dans les exemples précédents, vous ne pouvez pas répertorier les deux product.Name et car1.Name en tant que propriétés du même type anonyme. Cela est dû au fait que l’identificateur déduit pour chacun de ces éléments serait Name.

    ' Not valid.
    ' Dim anon5 = New With {Key product.Name, Key car1.Name}
    

    Le problème peut être résolu en affectant les valeurs aux noms de propriétés distincts.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Notez que les modifications dans le cas (les modifications entre les majuscules et les lettres minuscules) ne rendent pas deux noms distincts.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Le type initial et la valeur d’une propriété dépendent d’une autre propriété qui n’est pas encore établie. Par exemple, .IDName = .LastName n’est pas valide dans une déclaration de type anonyme, sauf si .LastName elle est déjà initialisée.

    ' Not valid.
    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
    

    Dans cet exemple, vous pouvez résoudre le problème en inversant l’ordre dans lequel les propriétés sont déclarées.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Un nom de propriété du type anonyme est identique au nom d’un membre de Object. Par exemple, la déclaration suivante échoue, car Equals il s’agit d’une méthode de Object.

    ' Not valid.
    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
    '                       "greater than", Key .Less = "less than"}
    

    Vous pouvez résoudre le problème en modifiant le nom de la propriété :

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Voir aussi