Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 Name
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 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 etproductName
productPrice
. Leurs types de données seront ceux des variables d’origine etString
Double
, 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’unCarClass
type qui inclut etID
desName
propriétés. Pour créer une instance de type anonyme,car1
avecName
etID
des 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
car2
anonyme .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é,Book
de 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
anon1
someFunction
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
etcar1.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 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 = .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"}