Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 nomi di proprietà e tipi da altre origini. Le sezioni seguenti forniscono un elenco delle circostanze in cui è possibile l'inferenza ed esempi di situazioni in cui non è possibile.
Inferenza andata a buon fine
I tipi anonimi possono dedurre nomi e tipi di proprietà dalle origini seguenti:
Dai nomi delle variabili. Il tipo
anonProduct
anonimo avrà due proprietà eproductName
productPrice
. I tipi di dati saranno quelli delle variabiliString
originali eDouble
, rispettivamente.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}
Da nomi di proprietà o di campo di altri oggetti. Si consideri, ad esempio, un oggetto di tipo
car
che include proprietàCarClass
eName
. Per creare una nuova istanza di tipo anonimo, ,car1
conName
le proprietà eID
inizializzate con i valori dell'oggettocar
, è possibile scrivere quanto segue:Dim car1 = New With {Key car.Name, Key car.ID}
La dichiarazione precedente equivale alla riga di codice più lunga che definisce il tipo
car2
anonimo .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(Of XElement).Da una funzione senza parametri, ad esempio
SomeFunction
nell'esempio seguente.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
La variabile
anon2
nel codice seguente è un tipo anonimo con una proprietà, un carattere denominatoFirst
. 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)
Errori di inferenza
L'inferenza del nome avrà esito negativo in molte circostanze, tra cui:
L'inferenza deriva dalla chiamata di un metodo, di un costruttore o di una proprietà con parametri che richiede argomenti. La dichiarazione precedente di
anon1
ha esito negativo sesomeFunction
ha uno o più argomenti.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
L'assegnazione a un nuovo nome di 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 più proprietà produce due o più proprietà con lo stesso nome. Facendo riferimento alle dichiarazioni negli esempi precedenti, non è possibile elencare sia
product.Name
checar1.Name
come proprietà dello stesso tipo anonimo. Ciò è dovuto al fatto che l'identificatore dedotto per ognuno di questi sarebbeName
.' 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 modifiche nel caso (modifiche tra lettere maiuscole e minuscole) non rendono distinti 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 iniziali 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 non.LastName
sia già inizializzato.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
In questo esempio è possibile risolvere il problema invertendo l'ordine in cui vengono dichiarate le proprietà.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Un nome di proprietà del tipo anonimo corrisponde al nome di un membro di Object. Ad esempio, la dichiarazione seguente ha esito negativo perché
Equals
è un metodo di Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
È possibile risolvere il problema modificando il nome della proprietà:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}