Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os tipos anônimos não fornecem nenhum mecanismo para especificar diretamente os tipos de dados das propriedades. Os tipos de todas as propriedades são inferidos. No exemplo a seguir, os tipos de Name e Price são inferidos diretamente dos valores usados para inicializá-los.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Os tipos anônimos também podem inferir nomes e tipos de propriedades de outras fontes. As secções que se seguem fornecem uma lista das circunstâncias em que a inferência é possível e exemplos de situações em que tal não acontece.
Inferência bem-sucedida
Os tipos anônimos podem inferir nomes e tipos de propriedade das seguintes fontes:
A partir de nomes de variáveis. O tipo
anonProductanônimo terá duas propriedadesproductNameeproductPrice. Seus tipos de dados serão os das variáveisStringoriginais eDouble, 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 propriedades ou campos de outros objetos. Por exemplo, considere um
carobjeto de umCarClasstipo que incluiNameeIDpropriedades. Para criar uma nova instância de tipo anónimo,car1, com as propriedadesNameeIDque são inicializadas com os valores do objetocar, 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
car2anônimo.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}De nomes de membros XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}O tipo resultante para
anonteria uma propriedade,Book, do tipo IEnumerable(Of XElement).De uma função que não tem parâmetros, como
SomeFunctionno exemplo a seguir.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}A variável
anon2no código a seguir é um tipo anônimo que tem uma propriedade, um caractere chamadoFirst. Esse código exibirá uma letra "E", a letra que é retornada por 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 o 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
anon1falha sesomeFunctiontiver um ou mais argumentos.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}A 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. Referindo-se a declarações em exemplos anteriores, não é possível listar tanto
product.Namecomocar1.Namecomo propriedades do mesmo tipo anónimo. Isso ocorre porque o identificador inferido para cada um deles seriaName.' 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}Tenha em conta que as mudanças entre 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 está estabelecida. Por exemplo, não é válido em uma declaração de tipo anônimo,
.IDName = .LastNamea menos que.LastNamejá tenha sido inicializado.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}Neste exemplo, você pode corrigir o problema invertendo a ordem em que 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 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"}