Compartilhar via


Como inferir nomes e tipos de propriedade em declarações de tipo anônimo (Visual Basic)

Tipos anônimos fornecem nenhum mecanismo para especificar os tipos de dados de propriedades diretamente. Tipos de todas as propriedades são inferidos. No exemplo a seguir, os tipos de Name e Price são inferidos diretamente dos valores que são usados para inicializá-los.

' Variable product is an instance of a simple anonymous type. 
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Anônimos tipos também podem interpretar nomes de propriedades e tipos de outras fontes. As seções a seguir fornecem uma lista das circunstâncias onde a inferência é possível, e exemplos de situações em que ele é não.

Inferência bem-sucedida

Anônimos tipos também podem interpretar nomes de propriedades e tipos de outras fontes.

  • Dos nomes de variável. Tipo anônimo anonProduct terá duas propriedades, productName e productPrice. Os tipos de dados será das variáveis do originais, String e Double, respectivamente.

    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}
    
  • De propriedade ou campo Nomes de outros objetos. Por exemplo, considere um car objeto de um tipo CarClass que inclui Name e ID Propriedades. Para criar um novo tipo anônimo instância, car1,com Name e ID propriedades que são inicializadas com os valores de car objetos, você pode escrever o seguinte:

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    A declaração anterior é equivalente a mais a linha de código que define car2 tipo anônimo.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • De XML membro nomes.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    O tipo de anon resultante teria uma propriedade, Book,do tipo IEnumerable (de XElement).

  • De uma função que não tem parâmetros, como SomeFunction no exemplo a seguir.

    Dim sc As New SomeClass

    Dim anon1 = New With {Key sc.SomeFunction()}

    A variável anon2 no código a seguir é um tipo que tem uma propriedade, um caractere chamado First anônimo. Esse código irá exibir uma letra "E", a letra que é retornada pela função First``1.

    Dim aString As String = "Example String" 
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

A inferência de falhas

Nome inferência falhará em muitas circunstâncias, incluindo o seguinte:

  • A inferência deriva de Invocação de um método, um construtor ou uma propriedade com parâmetros que necessita de argumentos. A declaração anterior de anon1 falhará se someFunction possui um ou mais argumentos.

    ' Not valid.

    ' Dim anon3 = New With {Key sc.someFunction(someArg)}

    Atribuição a um novo nome de propriedade resolve o problema.

    ' Valid.

    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}

  • A inferência deriva de uma expressão complexa.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    O erro pode ser resolvido atribuindo o resultado da expressão a um nome de propriedade.

    ' Valid. 
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • A inferência de várias propriedades produz dois ou mais propriedades que têm o mesmo nome. Referência de volta a declarações nos exemplos anteriores, você não é possível listar os dois product.Name e car1.Name Como propriedades do mesmo tipo anônimo. Isso ocorre porque o identificador inferido para cada um deles seria Name.

    ' Not valid.

    ' Dim anon5 = New With {Key product.Name, Key car1.Name}

    O problema pode ser resolvido atribuindo valores a nomes de propriedades distintas.

    ' Valid. 
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Observe que as alterações caso (alterações entre letras maiúsculas e minúsculas) não faça dois nomes distintos.

    Dim price = 0

    ' Not valid, because Price and price are the same name.

    ' Dim anon7 = New With {Key product.Price, Key price}

  • O tipo inicial e valor de uma propriedade depende outra propriedade que ainda não é estabelecida. Por exemplo, .IDName = .LastName não é válido em um declaração de tipo anônimo a menos que .LastName já esteja inicializado.

    ' Not valid.

    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}

    Nesse exemplo, você pode corrigir o problema, invertendo a ordem na qual as propriedades são declaradas.

    ' Valid. 
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Uma propriedade Nome do tipo anônimo é o mesmo como o nome de um membro do Object. Por exemplo, a seguinte declaração falha porque Equals é um método de Object.

    ' Not valid.

    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _

    ' "greater than", Key .Less = "less than"}

    Você pode corrigir o problema alterando o nome da propriedade:

    ' Valid  
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Consulte também

Referência

Chave (Visual Basic)

Conceitos

Inicializadores de objeto: tipos nomeados e anônimos (Visual Basic)

Inferência de tipo local (Visual Basic)

Tipos anônimos (Visual Basic)