Condividi tramite


Procedura: Dedurre nomi e tipi di proprietà nelle dichiarazioni di tipi anonimi (Visual Basic)

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à e productNameproductPrice. I tipi di dati saranno quelli delle variabili String originali e Double, 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 e Name. Per creare una nuova istanza di tipo anonimo, , car1con Name le proprietà e ID inizializzate con i valori dell'oggetto car , è 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 car2anonimo .

    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 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)
    

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 se someFunction 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 che car1.Name come proprietà dello stesso tipo anonimo. Ciò è dovuto al fatto che l'identificatore dedotto per ognuno di questi 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 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"}
    

Vedere anche