Alterações de quebra do Visual Basic 2008

A tabela a seguir lista todas as alterações que podem impedir que um aplicativo que foi criado no Visual Studio 2005 Compilando no Visual Studio 2008, ou que podem mudar seu comportamento em time de execução.

Category (Categoria)

Problema

Descrição

Tipos anuláveis

T alargamento como V?é uma conversão predefinida no Visual Studio 2008.

No Visual Studio 2005, você pode criar uma conversão definida pelo usuário para permitir que T Para alargar a Nullable(Of T). sistema autônomo parte do maior suporte para tipos nullable no Visual Studio 2008, essa conversão é predefinida.

Porque a resolução de sobrecarga considera conversões predefinidas e definidas pelo usuário, existe uma ambigüidade potencial se as existirem.Portanto, código que contém uma conversão de expansão definida pelo usuário para T T?é potencialmente ambíguo no Visual Studio 2008.

Por exemplo, no código a seguir, a telefonar para c3.Sub1 funciona no Visual Studio 2005, mas causa um erro de compilador no Visual Studio 2008.

Module Module1
Sub Main()
Dim c3 As New Class3
Dim sh As Short = 2
' The following statement compiles in Visual Studio 2005,
' but causes an error in Visual Studio 2008.
'c3.Sub1(sh)
End Sub
End Module
Class Class1
Public Shared Widening Operator CType(ByVal s As _
Nullable(Of Short)) As Class1
Return New Class1()
End Operator
End Class
Class Class2
Public Shared Widening Operator CType(ByVal n As Integer) As Class2
Return New Class2()
End Operator
End Class
Class Class3
Sub Sub1(ByVal c As Class1)
End Sub
Sub Sub1(ByVal c As Class2)
End Sub
End Class

Para resolver esse problema, você pode remover a conversão definida pelo usuário ou você pode converter explicitamente para Class1 ou Class2:

c3.Sub1(CType(sh, Class1))

Resolução de sobrecarga

Diferenças entre classes genéricas e não genéricas foram corrigidas de resolução de sobrecarga.

Um bug no Visual Studio 2005 pode causar comportamento de resolução de sobrecarga para classes genéricas sejam diferentes das classes não-genéricas.No exemplo a seguir, Class1 e Class2 são idênticos, exceto pelo fato de que Class2 tem um parâmetro genérico definidas nela. A telefonar para c1.Sub1 em Main é ambígua porque o argumento transmitido poderia BIND a qualquer sobrecarga de Sub1 em Class1. A ambigüidade causará um erro de compilador no Visual Studio 2005 e Visual Studio 2008.

A telefonar para c2.Sub1 deve gerar o mesmo erro, mas no Visual Studio 2005 faz não. Em vez disso, o método vincula a sobrecarga sem restrição de Sub1 em Class2.

Esse problema é corrigido no Visual Studio 2008.As duas chamadas geram erros do compilador devido a ambigüidade.Isso é ilustrado no código a seguir:

Module Module1
Sub Main()
Dim c1 As New Class1
Dim c2 As New Class2(Of String)
' The following statement causes a compiler error in both
' Visual Studio 2005 and Visual Studio 2008.
'c1.Sub1(New Nullable(Of Integer))
' The following statement causes a compiler error only
' in Visual Studio 2008.
'c2.Sub1(New Nullable(Of Integer))
End Sub
End Module
Class Class1
Sub Sub1(Of T)(ByVal arg As T)
Console.WriteLine("Unconstrained Sub1 in Class1")
End Sub
Sub Sub1(Of T As Structure)(ByVal arg As Nullable(Of T))
Console.WriteLine("Constrained Sub1 in Class1")
End Sub
End Class
Class Class2(Of U)
Sub Sub1(Of T)(ByVal arg As T)
Console.WriteLine("Unconstrained Sub1 in Class2")
End Sub
Sub Sub1(Of T As Structure)(ByVal arg As Nullable(Of T))
Console.WriteLine("Constrained Sub1 in Class2")
End Sub
End Class

Para resolver esse problema, você pode alterar os métodos sobrecarregados para que eles não são mais ambíguos ou você pode especificar os argumentos de tipo explicitamente:

c1.Sub1(Of Integer?)(New Nullable(Of Integer))
c2.Sub1(Of Integer?)(New Nullable(Of Integer))

Resolução de sobrecarga

Resolução com genérico e de sobrecargaParamArray parâmetros produz resultados diferentes no Visual Studio 2008.

O meta de resolução de sobrecarga é tentar selecionar o método candidato cujos parâmetros mais se aproximam os tipos de argumentos que são passados para o método.No exemplo nesta seção, Sub1 sobrecarregado por uma hierarquia de herança e é chamado com argumentos de tipo Integer e Short.

Resolução de sobrecarga de regras no Visual Studio 2005 e Visual Studio 2008 especificam que direcionam correspondências são correspondências melhor que aqueles que exigem ParamArray parâmetros. No entanto, usando regras de resolução de sobrecarga do Visual Studio 2005, inferência de tipos de tipos falha para o candidato sobrecarga na classe derivada, Class2, pois Y não pode ser um Integer e um Short, e as correspondências exatas são necessárias. Se argumentos sh e n foram do mesmo tipo, o Sub1 em Class2 seria preferencial sobre o candidato em Class1, que tem um ParamArray parâmetro. No entanto, como os dois argumentos têm tipos diferentes, a classe base sobrecarga em Class1 está selecionado em vez disso. T is inferred as Integer, and Short widens into the ParamArrayp.

O Visual Studio 2008 usa um algoritmo de novo que seleciona sistema autônomo mesmos métodos sobrecarregados sistema autônomo o Visual Studio 2005, exceto neste caso específico.No Visual Studio 2008, o algoritmo determina que Integer é o tipo dominante neste exemplo, porque Short amplia a Integer. Tipo de parâmetro Y na classe derivada é inferida para ser Integer, e Short amplia a Integer. sistema autônomo resultado, a Sub1 na classe derivada é chamada.

Module Module1
Sub Main()
Dim c2 As New Class2
Dim n As Integer
Dim sh As Short
c2.Sub1(n, sh)
End Sub
Class Class1
Sub Sub1(Of T)(ByVal arg1 As T, ByVal ParamArray p() As Integer)
Console.WriteLine("Visual Studio 2005 calls Sub1 " & _
"in the *base* class.")
End Sub
End Class
Class Class2 : Inherits Class1
Overloads Sub Sub1(Of Y)(ByVal arg1 As Y, ByVal arg2 As Y)
Console.WriteLine("Visual Studio 2008 calls Sub1 " & _
"in the *derived* class.")
End Sub
End Class
End Module

Você pode forçar o comportamento do Visual Studio 2005, projetando uma variável c2 digitar C1ass1 antes de chamar Sub1, ou passando argumento sh sistema autônomo uma matriz.

' You can cast variable c2 to Class1 in order to force Visual
' Studio 2005 behavior.
CType(c2, Class1).Sub1(n, sh)
' Alternatively, you can pass sh as an array.
c2.Sub1(n, New Integer() {sh})

Consulte também

Conceitos

Resolução de Sobrecarregamento

Tipos de Valor Anuláveis.

Tipos genéricos no Visual Basic

Referência

ParamArray

Date

History

Motivo

Julho de 2008

Tópico adicional.

Aprimoramento de informações.