Comment : déduire les types et les noms de propriétés dans des déclarations de types anonymes
Mise à jour : novembre 2007
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 de Name et Price 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 d'autres sources. Les sections qui suivent fournissent une liste des circonstances où l'inférence est possible et des exemples de situations où elle ne l'est pas.
Inférence réussie
Les types anonymes peuvent également déduire des noms de propriétés et des types des sources suivantes :
Noms de variables. Le type anonyme anonProduct possède deux propriétés : name et price. Leurs types de données sont ceux des variables d'origine, String et Double respectivement.
Dim productName As String = "paperclips" Dim productPrice As Double = 1.29 Dim anonPproduct = New With {Key productName, Key productPrice} ' To create uppercase variable names for the new properties, ' assign variables productName and productPrice to uppercase identifiers. Dim anonPproduct1 = New With {Key .Name = productName, Key .Price = productPrice}
Noms de propriétés ou de champs d'autres objets. Prenez, par exemple, un objet car de type CarClass qui inclut les propriétés Name et ID. Pour créer une instance de type anonyme car1 avec les propriétés Name et ID initialisées avec les valeurs de l'objet car, vous pouvez écrire ce qui suit :
Dim car1 = New With {Key car.Name, Key car.ID}
La déclaration qui précède équivaut à la plus longue ligne de code qui définit le type anonyme car2.
Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Noms de membres XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Le type résultant pour anon aurait une propriété, Book de type IEnumerable(Of XElement).
Fonction n'ayant aucun paramètre, telle que SomeFunction (voir l'exemple suivant).
Dim sc As New SomeClass
Dim anon1 = New With {Key sc.SomeFunction()}
La variable anon2 du code qui suit est un type anonyme qui a une propriété, un caractère nommé First. Ce code affiche la lettre E, à savoir la lettre renvoyé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 de l'inférence
L'inférence de nom échoue dans de nombreuses circonstances, y compris les suivantes :
L'inférence dérive de l'appel d'une méthode, d'un constructeur ou d'une propriété paramétrée qui requiert des arguments. La déclaration anon1 précédente échoue si someFunction comporte un ou plusieurs arguments.
' Not valid.
' Dim anon3 = New With {Key sc.someFunction(someArg)}
L'assignation à 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 assignant 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, portant le même nom. Pour faire référence aux déclarations des exemples qui précèdent, vous ne pouvez pas répertorier à la fois product.Name et car1.Name en tant que propriétés du même type anonyme. Cela s'explique par le fait que l'identificateur déduit pour chacune serait Name.
' Not valid.
' Dim anon5 = New With {Key product.Name, Key car1.Name}
Le problème peut être résolu en assignant les valeurs à des noms de propriétés distincts.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Notez que les changements de casse (majuscules et minuscules) ne produisent pas deux noms différents.
Dim price = 0
' Not valid, because Price and price are the same name.
' Dim anon7 = New With {Key product.Price, Key price}
Le type et la valeur de départ 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, à moins que .LastName ne soit déjà initialisé.
' 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é de type anonyme est identique au nom d'un membre de Object. Par exemple, la déclaration suivante échoue parce que la propriété Equals est une méthode 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
Tâches
Comment : déclarer une instance d'un type anonyme
Concepts
Initialiseurs d'objets : types nommés et anonymes
Comparaison entre types nommés et types anonymes