Compartir a través de


Cambios problemáticos en Visual Basic 2010

En la tabla siguiente se enumeran todos los cambios que pueden impedir la compilación en Visual Basic 2010 de una aplicación creada en Visual Basic 2008 o que pueden cambiar su comportamiento en tiempo de ejecución.

Categoría

Problema

Descripción

Inferencia de tipos de matriz

Las reglas de inferencia de los inicializadores de matriz han cambiado.

Por ejemplo, Dim x() = {1, 2, 3} deduce como tipo Integer.

Dim x() = {1, 2.2, "3"} produce un error del compilador cuando Option Strict se establece en On.

En Visual Basic 2008, al declarar una variable de matriz y omitir el tipo de elemento, el compilador supone que el tipo de elemento es Object. Visual Basic 2010 presenta la inferencia para los tipos de elemento de matriz y deduce que el tipo de elemento es el tipo dominante del literal de matriz.

Si no hay ningún tipo dominante, se supone el tipo Object. En este caso, si Option Strict está establecido en On, se produce un error del compilador.

Para obtener más información, vea Matrices en Visual Basic.

Conflictos de nomenclatura

Los tipos de los espacios de nombres importados en el archivo tienen prioridad sobre los tipos de los espacios de nombres importados en el proyecto.

Si dos espacios de nombres contienen un tipo con el mismo nombre, y un tipo se encuentra en un espacio de nombres importado en proyecto y el otro tipo con el mismo nombre se encuentra en un espacio de nombres importado en el archivo, Visual Basic 2010 enlaza al tipo en el espacio de nombres importado en el archivo. Las versiones anteriores enlazaban al tipo del espacio de nombres importado en el proyecto. Para obtener más información, vea Instrucción Imports (Tipo y espacio de nombres de .NET).

Palabras clave de consulta como identificadores

El uso de una palabra clave de consulta como identificador puede producir resultados inesperados.

El compilador de Visual Basic acepta palabras clave como nombres de identificador en diferentes contextos. Debido a las nuevas reglas de continuación implícita de la línea agregadas en Visual Basic 2010, se puede producir un error si se usa una palabra clave como nombre de elemento en un consulta LINQ que omite los caracteres de continuación de línea.

Por ejemplo, en el siguiente ejemplo se utiliza la palabra clave Aggregate como nombre de identificador. Si el identificador aggregate aparece inmediatamente después de una consulta, se considera parte de ella debido a las reglas de continuación implícita de línea de las cláusulas de consulta. En este ejemplo, esto produce un error del compilador.

Dim aggregate = 0
Dim numbers = {1, 2, 3, 4, 5}
Dim query As IEnumerable(Of Integer)

While aggregate < 5

    query = From i In numbers
            Skip aggregate
            Take 1
            Select i
    aggregate += 1

End While

Para asegurarse de que una línea no se incluye de forma implícita en la línea de código anterior, agregue un salto de línea adicional antes de la línea de código, tal como se muestra en el siguiente ejemplo.

    query = From i In numbers
            Skip aggregate
            Take 1
            Select i

    aggregate += 1

Para obtener más información acerca de la continuación implícita de línea, vea Instrucciones en Visual Basic.

Módulos

Los módulos se compilan como MustInherit.

Ahora los módulos se compilan como MustInherit. Esto no afecta al comportamiento de los módulos, pero puede afectar al código que utiliza la reflexión para examinar los tipos creados por la instrucción Module de Visual Basic. Para obtener más información, vea Module (Instrucción).

Expresiones lambda

Las expresiones lambda anónimas generan tipos únicos.

Ahora se garantiza que los tipos de delegado anónimos que se generan para las expresiones lambda son únicos. Esto puede afectar al código que evalúa la igualdad de los tipos de delegados anónimos, como el código del siguiente ejemplo.

Dim x = Function(a As Integer) a + 1
Dim y = Function(b As Integer) b + 1

' Returns True in Visual Basic 2008. Returns False in Visual Basic 2010.
Dim t = x.GetType().Equals(y.GetType())

Para obtener más información, vea Lambda (expresiones) (Visual Basic).

Varianza en interfaces genéricas

Las interfaces genéricas pueden aportar ambigüedad.

Visual Basic 2010 admite la varianza (covarianza y contravarianza) en las interfaces genéricas. Puede aparecer un error de advertencia sobre interfaces ambiguas cuando se implementan varias interfaces y una interfaz deriva de otra.

Para obtener más información, vea Varianza en interfaces genéricas (C# y Visual Basic).

Métodos de extensión

Se prefieren los métodos locales antes que los métodos de extensión.

Si un método de extensión se define con el mismo nombre y parámetros que un método definido para un tipo, el compilador enlaza al método local en lugar de hacerlo al método de extensión. Este comportamiento corrige el comportamiento de enlace incorrecto de Visual Basic 2008. Para obtener más información, vea Métodos de extensión (Visual Basic).

Tipos de valor que aceptan valores NULL

La prueba de un tipo de valor que acepta valores NULL para Nothing mediante el operador =, tal como se muestra en el siguiente código, produce un error del compilador.

Dim i? As Integer
If i = Nothing Then
  ' ...
End If

Si prueba un tipo de valor que acepta valores NULL para Nothing mediante el operador =, el resultado es False aunque el tipo sea Nothing lo que, con toda probabilidad, no es el resultado que se desea. Es preferible usar el operador Is, tal como se muestra en el ejemplo siguiente.

Dim i? As Integer
If i Is Nothing Then
  ' ...
End If

Invocación implícita de funciones o propiedades sin parámetros

Si una función o una propiedad devuelven un valor que se puede indizar como una cadena o una matriz, puede utilizar la sintaxis abreviada para hacer referencia a un elemento del valor devuelto por índice solamente si no existen sobrecargas para la función o la propiedad.

Considere una función o una propiedad sin parámetros que devuelve un valor que se puede indizar, tal como se muestra en el siguiente ejemplo.

Class Sample

    Public Function GetValue() As String
        Return "Default Value"
    End Function

End Class

Puede utilizar la sintaxis abreviada para hacer referencia a un elemento del valor devuelto por índica, tal como se muestra en el siguiente ejemplo.

Dim o As Object = New Sample()
' Returns "D" if no overloads exist for the GetValue function.
Dim val = o.GetValue(0)

Visual Basic 2008 permite esta sintaxis abreviada en las llamadas enlazadas en tiempo de ejecución aunque existan sobrecargas para la función o la propiedad. En Visual Basic 2010, puede utilizar la sintaxis abreviada para hacer referencia a un elemento del valor devuelto por índice solamente si no existe ninguna sobrecarga para la función o la propiedad.

Restricciones Class

La restricción Class ya no se supone.

Visual Basic 2008 deduce la restricción Class en un parámetro genérico si está restringido por un segundo parámetro que, a su vez, está restringido por la restricción Class. Visual Basic 2010 ya no deduce que un parámetro genérico "hereda" la restricción Class. Esto se debe a que se podrían crear instancias del primer parámetro genérico con un tiempo que implementa una interfaz pero no es una clase. Las interfaces cumplen la restricción Class.

Para asegurarse de que un parámetro genérico se restringe como clase, agregue la restricción Class tal como se muestra en el siguiente ejemplo.

    ' The following code causes a compiler error.
    ' Function RefEquals(Of T1 As T2, T2 As Class)(ByVal x As T1, ByVal y As T2) As Boolean
    '     Return y Is x
    ' End Function

    ' The following code is valid in Visual Basic 2010.
    Function RefEquals(Of T1 As {T2, Class}, T2 As Class)(ByVal x As T1, ByVal y As T2) As Boolean
        Return y Is x
    End Function

Para obtener más información, vea Tipos genéricos en Visual Basic (Visual Basic).

Métodos de clase parcial

Si un método con parámetros genéricos restringidos se declara en varias clases parciales, todas las declaraciones del método deben tener restricciones idénticas.

Puede declarar un método con parámetros genéricos en varias clases parciales. En Visual Basic 2008, el compilador no siempre requiere que las restricciones de los parámetros genéricos coincidan en todas las declaraciones del método. Visual Basic 2010 requiere que todas las declaraciones del método tengan idénticas restricciones.

Para obtener más información, vea Tipos genéricos en Visual Basic (Visual Basic).

Árboles de expresión de expresiones lambda

Se ha quitado la conversión boxing innecesaria de las instancias de tipos de parámetro genéricos

En Visual Basic 2008, dentro de un árbol de expresión de una expresión lambda, si un tipo de parámetro genérico se restringe a una interfaz, al invocar un método de una instancia de este tipo siempre se aplica la conversión boxing a dicha instancia. En Visual Basic 2010 solo se aplica la conversión boxing a la instancia cuando es necesario.

Para obtener más información acerca de las conversiones boxing y unboxing, vea Especificación del lenguaje de Visual Basic.

Expresiones lambda y árboles de expresión

Se puede devolver un árbol de expresión de una expresión lambda a partir de un árbol de expresión de otra expresión lambda.

En Visual Basic 2008, si una expresión lambda convierte una expresión lambda en un árbol de expresión, el compilador en ocasiones no realiza la conversión. El compilador de Visual Basic 2010 convierte correctamente las expresiones lambda en árboles de expresión si la conversión se produce dentro de una expresión lambda.

Vea también

Conceptos

Novedades de Visual Basic 2010

Otros recursos

Introducción a Visual Basic