Procedura: dedurre nomi di proprietà e tipi nelle dichiarazioni di tipo anonimo
Aggiornamento: novembre 2007
I tipi anonimi non forniscono alcun meccanismo per specificare direttamente i tipi di dati delle proprietà. I tipi di tutte le proprietà vengono dedotti. Nell'esempio seguente, i tipi di Name e Price vengono dedotti direttamente dai valori utilizzati per inizializzarli.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
I tipi anonimi possono anche dedurre i nomi e i tipi delle proprietà da altre origini. Nelle sezioni seguenti viene fornito un elenco delle circostanze in cui è possibile l'inferenza, ed esempi di situazioni in cui l'inferenza non è consentita.
Inferenza corretta
I tipi anonimi possono dedurre i nomi e i tipi delle proprietà dalle seguenti origini:
Dai nomi delle variabili. Il tipo anonimo anonProduct deve avere due proprietà, name e price. I relativi tipi di dati saranno quelli delle variabili originali, String e Double, rispettivamente.
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}
Dalle proprietà o dai nomi dei campi di altri oggetti. Si consideri ad esempio l'oggetto car di un tipo CarClass che include le proprietà Name e ID. Per creare una nuova istanza di tipo anonimo, car1, con proprietà Name e ID inizializzate con i valori dall'oggetto car, è possibile scrivere quanto segue:
Dim car1 = New With {Key car.Name, Key car.ID}
La dichiarazione precedente è equivalente alla riga di codice più lunga che definisce tipo anonimo car2.
Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Dai nomi dei membri XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Il tipo risultante per anon avrebbe una proprietà, Book, di tipo IEnumerable(Di XElement).
Da una funzione che non ha parametri, ad esempio SomeFunction , come illustrato nell'esempio seguente.
Dim sc As New SomeClass
Dim anon1 = New With {Key sc.SomeFunction()}
Il variabile anon2 nel codice seguente è un tipo anonimo che ha una proprietà, un carattere denominato First. Questo codice visualizzerà una lettera "E", la lettera restituita dalla funzione 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)
Inferenze non corrette
In molte circostanze l'inferenza del nome non avrà successo, come illustrato negli esempi seguenti:
L'inferenza deriva dalla chiamata di un metodo, di un costruttore, o di una proprietà con parametri che richiedono argomenti. La dichiarazione precedente di anon1 ha esito negativo se someFunction ha uno o più argomenti.
' Not valid.
' Dim anon3 = New With {Key sc.someFunction(someArg)}
L'assegnazione a un nuovo nome della proprietà risolve il problema.
' Valid.
Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
L'inferenza deriva da un'espressione complessa.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
L'errore può essere risolto assegnando il risultato dell'espressione a un nome di proprietà.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
L'inferenza per proprietà multiple produce due o più proprietà che hanno lo stesso nome. Riferendosi di nuovo alle dichiarazioni illustrate negli esempi precedenti, non è possibile elencare product.Name e car1.Name come proprietà dello stesso tipo anonimo. Perché l'identificatore dedotto per ognuno di queste sarebbe Name.
' Not valid.
' Dim anon5 = New With {Key product.Name, Key car1.Name}
Il problema può essere risolto assegnando i valori a nomi di proprietà distinti.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Si noti che le differenze di caso (lettere maiuscole o minuscole) non differenziano i due nomi.
Dim price = 0
' Not valid, because Price and price are the same name.
' Dim anon7 = New With {Key product.Price, Key price}
Il tipo e il valore iniziale di una proprietà dipendono da un'altra proprietà non ancora stabilita. Ad esempio, .IDName = .LastName non è valido in una dichiarazione di tipo anonimo a meno che .LastName sia già stato inizializzato.
' Not valid.
' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
In questo esempio, è possibile correggere il problema invertendo l'ordine nel quale sono dichiarate le proprietà.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Un nome di proprietà del tipo anonimo è uguale al nome di un membro di Object. Ad esempio, la seguente dichiarazione non ha esito positivo perché Equals è un metodo di Object.
' Not valid.
' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
' "greater than", Key .Less = "less than"}
È possibile correggere il problema modificando il nome della proprietà:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", _ Key .GreaterString = "greater than", _ Key .LessString = "less than"}
Vedere anche
Attività
Procedura: dichiarare un'istanza di un tipo anonimo
Concetti
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Confronto tra tipi denominati e tipi anonimi