Compartir a través de


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 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 y productNameproductPrice. Sus tipos de datos serán los de las variables String originales 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 propiedades Name y ID. Para crear una nueva instancia de tipo anónimo, car1, con Name las propiedades y ID que se inicializan con los valores del car 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 car2anó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 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

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 si someFunction 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 como car1.Name como propiedades del mismo tipo anónimo. Esto se debe a que el identificador deducido para cada uno de estos sería Name.

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

Consulte también