Compartilhar via


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

Tipos anônimos não fornecem nenhum mecanismo para especificar diretamente os tipos de dados de propriedades. 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}

Tipos anônimos também podem inferir nomes de propriedades e tipos de outras fontes. As seções a seguir fornecem uma lista das circunstâncias em que a inferência é possível e exemplos de situações em que ela não está.

Inferência bem-sucedida

Tipos anônimos podem inferir nomes de propriedades e tipos das seguintes fontes:

  • De nomes de variáveis. O tipo anônimo anonProduct terá duas propriedades productName e productPrice. Seus tipos de dados serão os das variáveis 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 nomes de propriedade ou de campo de outros objetos. Por exemplo, considere um objeto car de um tipo CarClass que inclui as propriedades Name e ID. Para criar uma nova instância de tipo anônimo, car1com as propriedades Name e ID inicializadas com os valores do objeto car, você pode escrever o seguinte:

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

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

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

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

    O tipo resultante para anon teria uma propriedade, Bookdo tipo IEnumerable(Of 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 anônimo que tem uma propriedade, um caractere chamado First. Esse código exibirá uma letra "E", a letra 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)
    

Falhas de inferência

A inferência de nome falhará em muitas circunstâncias, incluindo a seguinte:

  • A inferência deriva da invocação de um método, um construtor ou uma propriedade parametrizada que requer argumentos. A declaração anterior de anon1 falha se someFunction tiver 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 para várias propriedades produz duas ou mais propriedades que têm o mesmo nome. Fazendo referência a declarações em exemplos anteriores, você não pode listar ambas as propriedades 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 os valores a nomes de propriedade distintos.

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

    Observe que as alterações no caso (alterações entre letras maiúsculas e minúsculas) não tornam 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 o valor de uma propriedade dependem de outra propriedade que ainda não foi estabelecida. Por exemplo, .IDName = .LastName não é válido em uma 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"}
    

    Neste 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}
    
  • Um nome de propriedade do tipo anônimo é o mesmo que o nome de um membro de Object. Por exemplo, a declaração a seguir 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"}
    

Confira também