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 y productPrice. Sus tipos de datos serán los de las variables originales, String y 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}
    
  • Nombres de campo o propiedad de otros objetos. Por ejemplo, considere un objeto car de un tipo CarClass que incluya las propiedades Name y ID . Para crear una nueva instancia de tipo anónimo, car1, con las propiedades Name y ID que se inicializan con los valores del objeto car , 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 denominado First. 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 si someFunction 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 y car1.Name como propiedades del mismo tipo anónimo. Esto se debe a que el identificador inferido de cada uno de ellos sería Name.

    ' 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"}
    

Consulte también