Cómo: Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos (Visual Basic)
Los tipos anónimos no proporcionan ningún mecanismo para especificar directamente los tipos de datos de propiedades. Los tipos de todas las propiedades son inferidos. En el ejemplo siguiente, los tipos de Name
y Price
se infieren 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. En las secciones siguientes se ofrece una lista de las circunstancias donde es posible la inferencia y ejemplos de situaciones en 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 anónimo
anonProduct
tendrá dos propiedades,productName
yproductPrice
. Sus tipos de datos serán los de las variables originales,String
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 las propiedadesName
yID
. Para crear una nueva instancia de tipo anónimo,car1
, con las propiedadesName
yID
que se inicializan con los valores del objetocar
, puede escribir lo siguiente:Dim car1 = New With {Key car.Name, Key car.ID}
La declaración anterior es equivalente a la línea más larga de código que define el tipo anónimo
car2
.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 de
anon
tendría una propiedad,Book
, del tipo IEnumerable(de XElement).Una función sin parámetros, como
SomeFunction
en el ejemplo siguiente.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
La variable
anon2
en el 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
Se producirá un error en la inferencia de nombre en muchas circunstancias, incluidas las siguientes:
La inferencia se deriva de la invocación de un método, un constructor o una propiedad con parámetros que requiere argumentos. La declaración anterior de
anon1
genera un error sisomeFunction
tiene uno o más argumentos.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
La asignación a un nuevo nombre de propiedad resuelve el problema.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
La inferencia se 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 de varias propiedades genera dos o más propiedades con el mismo nombre. Si nos referimos a las declaraciones de los ejemplos anteriores, no se pueden mostrar
product.Name
ycar1.Name
como propiedades del mismo tipo anónimo. Esto se debe a que el identificador inferido de cada uno de ellos seríaName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
El problema puede resolverse asignando los valores a distintos nombres de propiedad.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Observe que los cambios entre mayúsculas y minúsculas no forman dos nombres 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 y el valor iniciales de una propiedad dependen de otra propiedad que todavía no está establecida. Por ejemplo,
.IDName = .LastName
no es válido en una declaración de tipo anónimo, a menos que.LastName
ya esté inicializado.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
En este ejemplo, puede corregir el problema invirtiendo el orden en que las propiedades están declaradas.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Un nombre de propiedad del tipo anónimo es igual que el nombre de un miembro de Object. Por ejemplo, la siguiente declaración genera un error 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"}
Puede corregir el problema cambiando el nombre de propiedad:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}