Compartilhar via


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

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.

    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: Nomeados e anônimos tipos (Visual Basic)

Inferência de tipo de local (Visual Basic)

Tipos anônimos (Visual Basic)