Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los tipos anónimos no proporcionan ningún mecanismo para especificar directamente los tipos de datos de las propiedades. Los tipos de todas las propiedades se deducen. En el ejemplo siguiente, los tipos de Name
y Price
se deducen directamente de los valores que se usan para inicializarlos.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Los tipos anónimos también pueden inferir nombres y tipos de propiedad de otros orígenes. Las secciones siguientes proporcionan una lista de las circunstancias en las que es posible la inferencia y ejemplos de situaciones en las que no lo es.
Inferencia correcta
Los tipos anónimos pueden inferir nombres y tipos de propiedad de los orígenes siguientes:
Nombres de variables. El tipo
anonProduct
anónimo tendrá dos propiedades yproductName
productPrice
. Sus tipos de datos serán los de las variablesString
originales yDouble
, 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}
Nombres de campo o propiedad de otros objetos. Por ejemplo, considere un objeto
car
de un tipoCarClass
que incluya propiedadesName
yID
. Para crear una nueva instancia de tipo anónimo,car1
, conName
las propiedades yID
que se inicializan con los valores delcar
objeto, puede escribir lo siguiente:Dim car1 = New With {Key car.Name, Key car.ID}
La declaración anterior es equivalente a la línea de código más larga que define el tipo
car2
anónimo .Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Nombres de miembros XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
El tipo resultante para
anon
tendría una propiedad,Book
, de tipo IEnumerable(De XElement).Desde una función que no tiene parámetros, como
SomeFunction
en el ejemplo siguiente.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
La variable
anon2
del código siguiente es un tipo anónimo que tiene una propiedad, un carácter denominadoFirst
. Este código mostrará una letra "E", la letra que devuelve la función 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)
Errores de inferencia
La inferencia de nombres producirá un error en muchas circunstancias, incluidas las siguientes:
La inferencia deriva de la invocación de un método, un constructor o una propiedad parametrizada que requiere argumentos. Se produce un error en la declaración anterior de
anon1
sisomeFunction
tiene uno o varios argumentos.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
La asignación de un nuevo nombre a la propiedad resuelve el problema.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
La inferencia deriva de una expresión compleja.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
El error se puede resolver asignando el resultado de la expresión a un nombre de propiedad.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
La inferencia para varias propiedades genera dos o más propiedades que tienen el mismo nombre. Al referirse a las declaraciones de ejemplos anteriores, no se pueden enumerar tanto
product.Name
comocar1.Name
como propiedades del mismo tipo anónimo. Esto se debe a que el identificador deducido para cada uno de estos seríaName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
El problema se puede resolver asignando los valores a nombres de propiedad distintos.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Tenga en cuenta que los cambios en el caso (cambios entre mayúsculas y minúsculas) no hacen que dos nombres sean distintos.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
El tipo inicial y el valor de una propiedad dependen de otra propiedad que aún no se haya establecido. Por ejemplo,
.IDName = .LastName
no es válido en una declaración de tipo anónimo a menos que.LastName
ya se haya inicializado.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
En este ejemplo, puede corregir el problema invirtiendo el orden en el que se declaran las propiedades.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Un nombre de propiedad del tipo anónimo es el mismo que el nombre de un miembro de Object. Por ejemplo, se produce un error en la siguiente declaración porque
Equals
es un método de Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
Para corregir el problema, cambie el nombre de la propiedad:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}