Cómo: Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos (Visual Basic)How to: Infer Property Names and Types in Anonymous Type Declarations (Visual Basic)

Los tipos anónimos no proporcionan ningún mecanismo para especificar directamente los tipos de datos de propiedades.Anonymous types provide no mechanism for directly specifying the data types of properties. Los tipos de todas las propiedades son inferidos.Types of all properties are inferred. En el ejemplo siguiente, los tipos de Name y Price se infieren directamente de los valores que se usan para inicializarlos.In the following example, the types of Name and Price are inferred directly from the values that are used to initialize them.

' 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.Anonymous types can also infer property names and types from other sources. 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.The sections that follow provide a list of the circumstances where inference is possible, and examples of situations where it is not.

Inferencia correctaSuccessful Inference

Los tipos anónimos pueden inferir nombres y tipos de propiedad de los orígenes siguientes:Anonymous types can infer property names and types from the following sources:

  • Nombres de variables.From variable names. El tipo anónimo anonProduct tendrá dos propiedades, productName y productPrice.Anonymous type anonProduct will have two properties, productName and productPrice. Sus tipos de datos serán los de las variables originales, String y Double, respectivamente.Their data types will be those of the original variables, String and Double, respectively.

    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.From property or field names of other objects. Por ejemplo, considere un objeto car de un tipo CarClass que incluya las propiedades Name y ID .For example, consider a car object of a CarClass type that includes Name and ID properties. 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:To create a new anonymous type instance, car1, with Name and ID properties that are initialized with the values from the car object, you can write the following:

    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.The previous declaration is equivalent to the longer line of code that defines anonymous type car2.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Nombres de miembros XML.From XML member names.

    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).The resulting type for anon would have one property, Book, of type IEnumerable(Of XElement).

  • Una función sin parámetros, como SomeFunction en el ejemplo siguiente.From a function that has no parameters, such as SomeFunction in the following example.

    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.The variable anon2 in the following code is an anonymous type that has one property, a character named First. Este código mostrará una letra "E", la letra que devuelve la función First.This code will display a letter "E," the letter that is returned by function 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 inferenciaInference Failures

Se producirá un error en la inferencia de nombre en muchas circunstancias, incluidas las siguientes:Name inference will fail in many circumstances, including the following:

  • La inferencia se deriva de la invocación de un método, un constructor o una propiedad con parámetros que requiere argumentos.The inference derives from the invocation of a method, a constructor, or a parameterized property that requires arguments. La declaración anterior de anon1 genera un error si someFunction tiene uno o más argumentos.The previous declaration of anon1 fails if someFunction has one or more arguments.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    La asignación a un nuevo nombre de propiedad resuelve el problema.Assignment to a new property name solves the problem.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • La inferencia se deriva de una expresión compleja.The inference derives from a complex expression.

    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.The error can be resolved by assigning the result of the expression to a property name.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • La inferencia de varias propiedades genera dos o más propiedades con el mismo nombre.Inference for multiple properties produces two or more properties that have the same name. 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.Referring back to declarations in earlier examples, you cannot list both product.Name and car1.Name as properties of the same anonymous type. Esto se debe a que el identificador inferido de cada uno de ellos sería Name.This is because the inferred identifier for each of these would be 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.The problem can be solved by assigning the values to distinct property names.

    ' 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.Note that changes in case (changes between uppercase and lowercase letters) do not make two names distinct.

    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.The initial type and value of one property depends on another property that is not yet established. Por ejemplo, .IDName = .LastName no es válido en una declaración de tipo anónimo, a menos que .LastName ya esté inicializado.For example, .IDName = .LastName is not valid in an anonymous type declaration unless .LastName is already initialized.

    ' 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.In this example, you can fix the problem by reversing the order in which the properties are declared.

    ' 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.A property name of the anonymous type is the same as the name of a member of Object. Por ejemplo, la siguiente declaración genera un error porque Equals es un método de Object.For example, the following declaration fails because Equals is a method of 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:You can fix the problem by changing the property name:

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Vea tambiénSee also