Freigeben über


Wichtige Änderungen in Visual Basic 2010

In der folgenden Tabelle sind alle Änderungen aufgeführt, die dazu führen können, dass eine in Visual Basic 2008 erstellte Anwendung in Visual Basic 2010 nicht kompiliert wird oder sich ihr Laufzeitverhalten ändert.

Kategorie

Problem

Beschreibung

Arraytyprückschluss

Rückschlussregeln für Arrayinitialisierer haben sich geändert.

Dim x() = {1, 2, 3} wird z. B. als Typ Integer abgeleitet.

Dim x() = {1, 2.2, "3"} verursacht einen Compilerfehler, wenn Option Strict auf On festgelegt wird.

In Visual Basic 2008 hält der Compiler den Elementtyp für ein Object, wenn Sie eine Arrayvariable deklarieren, aber den Elementtyp weglassen. Visual Basic 2010 führt Rückschlüsse für Arrayelementtypen durch und wählt per Rückschluss den bestimmenden Typ des Arrayliterals als Elementtyp.

Ist kein bestimmender Typ vorhanden, wird vom Object-Typ ausgegangen. In diesem Fall tritt ein Compilerfehler auf, wenn Option Strict auf On festgelegt ist.

Weitere Informationen finden Sie unter Arrays in Visual Basic.

Namenskonflikte

Auf Dateiebene in Namespaces importierte Typen sind wichtiger als Typen, die auf Projektebene in Namespaces importiert wurden.

Wenn zwei Namespaces jeweils einen Typ mit dem gleichen Namen enthalten und sich ein Typ in einem auf Projektebene importierten Namespace und der andere Typ mit dem gleichen Namen in einem auf Dateiebene importierten Namespace befindet, wird Visual Basic 2010 an den Typ im Namespace gebunden, der auf Dateiebene importiert wurde. Vorherige Versionen banden an den Typ im Namespace, der auf Projektebene importiert wurde. Weitere Informationen finden Sie unter Imports-Anweisung (.NET-Namespace und Typ).

Abfrageschlüsselwörter als Bezeichner

Das Verwenden eines Abfrageschlüsselworts als Bezeichner erzeugt möglicherweise unerwartete Ergebnisse.

Der Visual Basic-Compiler akzeptiert Schlüsselwörter in mehreren Kontexten als Bezeichner. Aufgrund der neuen Regeln für implizite Zeilenfortsetzung, die in Visual Basic 2010 hinzugefügt wurden, tritt möglicherweise ein Fehler auf, wenn Sie ein Schlüsselwort in einer LINQ-Abfrage, die Zeilenfortsetzungszeichen weglässt, als Elementnamen verwenden.

Im folgenden Beispiel wird z. B. das Aggregate-Schlüsselwort als Bezeichnername verwendet. Wenn der aggregate-Bezeichner sofort einer Abfrage folgt, wird er aufgrund der impliziten Zeilenfortsetzungsregeln für Abfrageklauseln als Teil dieser Abfrage gewertet. In diesem Beispiel verursacht dies einen Compilerfehler.

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

Fügen Sie, wie im folgenden Beispiel gezeigt, vor der Codezeile einen zusätzlichen Zeilenumbruch hinzu, um sicherzustellen, dass eine Zeile nicht implizit in der vorherigen Codezeile enthalten ist.

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

    aggregate += 1

Weitere Informationen zur impliziten Zeilenfortsetzung finden Sie unter Anweisungen in Visual Basic.

Module

Module werden als MustInherit kompiliert.

Module werden jetzt als MustInherit kompiliert. Dies beeinflusst nicht das Verhalten der Module, aber es wirkt sich möglicherweise auf Code aus, in dem Reflektion verwendet wird, um die Module-Anweisung vom Visual Basic erstellten Typen zu untersuchen. Weitere Informationen finden Sie unter Module-Anweisung.

Lambda-Ausdrücke

Anonyme Lambda-Ausdrücke generieren eindeutige Typen.

Die anonymen für Lambda-Ausdrücke erstellten Delegattypen sind jetzt eindeutig. Dies kann sich auf Code auswirken, in dem die Typen anonymer Delegaten nach Gleichheit ausgewertet werden, wie z. B. beim Code im folgenden Beispiel.

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())

Weitere Informationen finden Sie unter Lambda-Ausdrücke (Visual Basic).

Abweichungen bei generischen Schnittstellen

Mit generischen Schnittstellen könnten sich Mehrdeutigkeiten ergeben.

Visual Basic 2010 unterstützt Abweichungen (Kovarianz und Kontravarianz) bei generischen Schnittstellen. Beim Implementieren mehrerer Schnittstellen und wenn eine Schnittstelle von einer anderen abgeleitet wird, tritt möglicherweise ein Warnfehler zu mehrdeutigen Schnittstellen auf.

Weitere Informationen finden Sie unter Varianz in generischen Schnittstellen (C# und Visual Basic).

Erweiterungsmethoden

Lokale Methoden werden entgegen Erweiterungsmethoden vorgezogen.

Wenn eine Erweiterungsmethode mit dem gleichen Namen und den gleichen Parametern wie eine für einen Typ definierte Methode definiert wird, bindet der Compiler an die lokale Methode statt an die Erweiterungsmethode. Dieses Verhalten korrigiert falsches Bindungsverhalten in Visual Basic 2008. Weitere Informationen finden Sie unter Erweiterungsmethoden (Visual Basic).

Auf NULL festlegbare Werttypen

Beim Testen eines auf NULL festlegbaren Werttyps auf Nothing mithilfe des =-Operators, wird wie im folgenden Code gezeigt, ein Compilerfehler erzeugt.

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

Wenn Sie einen auf NULL festlegbaren Werttyp mit dem =-Operator auf Nothing testen, ist das Ergebnis False, auch wenn der auf NULL festlegbare Werttyp, der wahrscheinlich nicht das beabsichtigte Ergebnis ist, Nothing ist. Verwenden Sie stattdessen den Is-Operator, wie im folgenden Beispiel gezeigt.

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

Impliziter Aufruf von parameterlosen Funktionen oder Eigenschaften

Wenn eine Funktion oder eine Eigenschaft einen indizierbaren Wert z. B. eine Zeichenfolge oder ein Array zurückgibt, können Sie Kurzsyntax verwenden, um nur durch Index auf ein Element des Rückgabewerts zu verweisen, sofern keine Überladungen für die Funktion oder die Eigenschaft vorhanden sind.

Erwägen Sie eine parameterlose Funktion oder eine Eigenschaft, die einen indizierbaren Wert zurückgibt, wie im folgenden Beispiel gezeigt.

Class Sample

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

End Class

Sie können mithilfe von Kurzsyntax auf ein Element des Rückgabewerts nach Index verweisen, wie im folgenden Beispiel gezeigt.

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

Visual Basic 2008 plant diese Kurzsyntax für die spät gebundenen Aufrufe ein, auch wenn Überladungen für die Funktion oder Eigenschaft vorhanden sind. In Visual Basic 2010 können Sie nur mithilfe von Kurzsyntax auf ein Element des Rückgabewerts nach Index verweisen, wenn keine Überladungen für die Funktion oder Eigenschaft vorhanden sind.

Class-Einschränkungen

Es wird nicht mehr von der Class-Einschränkung ausgegangen.

Visual Basic 2008 leitet die Class-Einschränkung für einen generischen Parameter ab, wenn eine Einschränkung durch einen zweiten generischen Parameter gegeben ist, der von der Class-Einschränkung eingeschränkt wird. Visual Basic 2010 geht nicht mehr davon aus, dass ein generischer Parameter die Class-Einschränkung "erbt". Das liegt daran, dass der erste generische Parameter mit einem Typ instanziiert werden könnte, der eine Schnittstelle implementiert, aber keine Klasse ist. Schnittstellen stellen die Class-Einschränkung zufrieden.

Fügen Sie die Class-Einschränkung hinzu, um sicherzustellen, dass ein generischer Parameter als Klasse eingeschränkt wird, wie im folgenden Beispiel gezeigt.

    ' 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

Weitere Informationen finden Sie unter Generische Typen in Visual Basic (Visual Basic).

Partielle Klassenmethoden

Wenn eine Methode mit einem eingeschränkten generischen Parameter in mehr als einer partiellen Klasse deklariert wird, müssen alle Deklarationen der Methode identische Einschränkungen aufweisen.

Sie können eine Methode deklarieren, die über generische Parameter in mehr als einer partiellen Klasse verfügt. In Visual Basic 2008 müssen für den Compiler nicht immer die Einschränkungen der generischen Parameter mit den Deklarationen der Methode übereinstimmen. Visual Basic 2010 erfordert, dass alle Deklarationen der Methode identische Einschränkungen haben.

Weitere Informationen finden Sie unter Generische Typen in Visual Basic (Visual Basic).

Ausdrucksbaumstrukturen von Lambda-Ausdrücken

Entferntes unnötiges Boxing der Instanzen generischer Parametertypen

Wenn ein generischer Parametertyp auf eine Schnittstelle eingeschränkt wird, führt dies in Visual Basic 2008 innerhalb einer Ausdrucksbaumstruktur eines Lambda-Ausdrucks immer dazu, dass beim Aufrufen einer Methode für eine Instanz dieses Typs diese Instanz per Boxing konvertiert wird. In Visual Basic 2010 wird die Instanz nur mittels Boxing konvertiert, sofern dies notwendig ist.

Weitere Informationen zu Boxing und Unboxing finden Sie unter Visual Basic-Sprachspezifikation.

Lambda-Ausdrücke und Ausdrucksbaumstrukturen

Eine Ausdrucksbaumstruktur eines Lambda-Ausdrucks kann von einer Ausdrucksbaumstruktur eines Lambda-Ausdrucks zurückgegeben werden.

Wenn ein Lambda-Ausdruck einen Lambda-Ausdruck in eine Ausdrucksbaumstruktur umwandelt, führt in Visual Basic 2008 der Compiler die Umwandlung in einigen Fälle nicht aus. Der Visual Basic 2010-Compiler wandelt Lambda-Ausdrücke ordnungsgemäß in Ausdrucksbaumstrukturen um, wenn die Umwandlung innerhalb eines Lambda-Ausdrucks durchgeführt wird.

Siehe auch

Konzepte

Neues in Visual Basic 2010

Weitere Ressourcen

Erste Schritte mit Visual Basic