Share via


Cómo: Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos

Actualización: noviembre 2007

Los tipos anónimos no proporcionan ningún mecanismo para especificar directamente los tipos de datos de las propiedades. Se deducen los tipos de todas las propiedades. 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 deducir los nombres y los tipos de las propiedades a partir de otros orígenes. En las secciones siguientes se proporciona una lista de los casos en los que es posible la inferencia, así como ejemplos de situaciones en las que no lo es.

Inferencia correcta

Los tipos anónimos pueden deducir los nombres y los tipos de las propiedades a partir de los siguientes orígenes:

  • Nombres de variables. El tipo anónimo anonProduct tendrá dos propiedades, name y price. 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 anonPproduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonPproduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • Nombres de propiedades o campos de otros objetos. Por ejemplo, considere un objeto car de un tipo CarClass que incluye las propiedades Name y ID. Para crear una nueva instancia de tipo anónima, 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, de tipo IEnumerable(de XElement).

  • 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 del código siguiente es un tipo anónimo que tiene una propiedad, un carácter denominado First. Este código mostrará la 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 de inferencia de nombre en muchos casos, incluidos los 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 provoca 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. Haciendo referencia a las declaraciones de ejemplos anteriores, no puede citar en una lista product.Name y car1.Name como propiedades del mismo tipo anónimo. La razón es que el identificador deducido de cada una de ellas 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 propiedades distintos.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Tenga en cuenta que los cambios entre letras mayúsculas y minúsculas no convierten dos nombres en 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 ha establecido. Por ejemplo, .IDName = .LastName no es válido en una declaración de tipos anónima a menos que ya se haya inicializado .LastName.

    ' 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 igual que el nombre de un miembro de Object. Por ejemplo, se produce un error en la declaración siguiente 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"}
    

Vea también

Tareas

Cómo: Declarar una instancia de un tipo anónimo

Conceptos

Inicializadores de objeto: Tipos con nombre y anónimos

Inferencia de tipo de variable local

Tipos anónimos

Tipos con nombre y anónimos comparados

Referencia

Key (Visual Basic)