Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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
anonProductanonyme aura deux propriétés etproductNameproductPrice. Leurs types de données seront ceux des variables d’origine etStringDouble, 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
carobjet d’unCarClasstype qui inclut etIDdesNamepropriétés. Pour créer une instance de type anonyme,car1avecNameetIDdes propriétés initialisées avec les valeurs de l’objetcar, 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
anonune propriété,Bookde type IEnumerable(Of XElement).À partir d’une fonction qui n’a aucun paramètre, par
SomeFunctionexemple dans l’exemple suivant.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}La variable
anon2dans 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
anon1someFunctioncontient 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.Nameetcar1.Nameen 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 seraitName.' 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 = .LastNamen’est pas valide dans une déclaration de type anonyme, sauf si.LastNameelle 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
Equalsil 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"}