Cambios problemáticos en Visual Basic 2008
Actualización: Julio de 2008
En la tabla siguiente se enumeran todos los cambios que pueden impedir la compilación en Visual Studio 2008 de una aplicación creada en Visual Studio 2005 o que pueden cambiar su comportamiento en tiempo de ejecución.
Category |
Problema |
Descripción |
---|---|---|
Tipos que aceptan valores NULL |
La ampliación de T a T? es una conversión predefinida en Visual Studio 2008. |
En Visual Studio 2005, puede crear una conversión definida por el usuario para permitir la ampliación de T a Nullable(Of T). Como parte de la mayor compatibilidad con los tipos que aceptan valores NULL en Visual Studio 2008, esta conversión está predefinida. Dado que la resolución de sobrecarga tiene en cuenta las conversiones predefinidas y las conversiones definidas por el usuario, se puede producir una ambigüedad si existen ambas. Por tanto, el código que contiene una conversión de ampliación definida por el usuario de T a T? es potencialmente ambiguo en Visual Studio 2008. Por ejemplo, en el código siguiente, la llamada a c3.Sub1 funciona en Visual Studio 2005 pero genera un error del compilador en Visual Studio 2008.
Para resolver este problema, puede quitar la conversión definida por el usuario o puede convertir explícitamente a Class1 o Class2:
|
Resolución de sobrecarga |
Se han corregido las diferencias en la resolución de sobrecarga entre las clases genéricas y no genéricas. |
Un error en Visual Studio 2005 puede hacer que el comportamiento de la resolución de sobrecarga en las clases genéricas sea diferente del comportamiento en las clases no genéricas. En el ejemplo siguiente, Class1 y Class2 son idénticos salvo en que Class2 incluye un parámetro genérico definido. La llamada a c1.Sub1 en Main es ambigua porque el argumento pasado puede enlazar a cualquier sobrecarga de Sub1 en Class1. La ambigüedad produce un error del compilador en Visual Studio 2005 y Visual Studio 2008. La llamada a c2.Sub1 debe generar el mismo error, pero en Visual Studio 2005 no lo hace. En su lugar, el método enlaza a la sobrecarga sin restricciones de Sub1 en Class2. Este problema se ha corregido en Visual Studio 2008. Ambas llamadas generan errores del compilador debido a la ambigüedad. Esto queda reflejado en el ejemplo de código siguiente:
Para resolver este problema, puede cambiar las sobrecargas para que no sean ambiguos o puede especificar explícitamente los argumentos de tipo:
|
Resolución de sobrecarga |
La resolución de sobrecarga con parámetros genéricos y parámetros ParamArray genera diferentes resultados en Visual Studio 2008. |
El objetivo de la resolución de sobrecarga consiste en intentar seleccionar el método candidato cuyos parámetros coinciden más estrechamente con los tipos de argumentos que se pasan al método. En el ejemplo de esta sección, Sub1 se sobrecarga en una jerarquía de herencia y se llama con argumentos de tipo Integer y Short. Las reglas de resolución de sobrecarga en Visual Studio 2005 y Visual Studio 2008 especifican que las coincidencias directas son mejores coincidencias que las que requieren parámetros ParamArray. Sin embargo, al utilizar las reglas de resolución de sobrecarga de Visual Studio 2005, se produce un error en la inferencia de tipos para el candidato de sobrecarga en la clase derivada, Class2, porque Y no puede ser Integer y Short a la vez y se requieren coincidencias exactas. Si los argumentos sh y n fuesen del mismo tipo, se preferiría Sub1 de Class2 antes que el candidato de Class1, que tiene un parámetro ParamArray. Sin embargo, dado que ambos argumentos tienen tipos diferentes, se selecciona la sobrecarga de clase base de Class1. T se infiere como Integery Short se amplía en el parámetro ParamArrayp. Visual Studio 2008 utiliza un nuevo algoritmo que selecciona las mismas sobrecargas que Visual Studio 2005, excepto en este caso concreto. En Visual Studio 2008, el algoritmo determina que Integer es el tipo dominante en este ejemplo, porque Short se amplía a Integer. El parámetro de tipo Y de la clase derivada se infiere como Integer y Short se amplía a Integer. Como resultado, se llama a Sub1 en la clase derivada.
Puede exigir el comportamiento de Visual Studio 2005 mediante la conversión de la variable c2 al tipo C1ass1 antes de llamar a Sub1 o mediante la transferencia del argumento sh como una matriz.
|
Vea también
Conceptos
Tipos de valor que aceptan valores NULL
Tipos genéricos en Visual Basic
Referencia
Historial de cambios
Fecha |
Historial |
Motivo |
---|---|---|
Julio de 2008 |
Se ha agregado un tema. |
Mejora de la información. |