Sdílet prostřednictvím


Průlomové změny v Visual Basic 2010

V následující tabulce jsou uvedeny všechny změny, které by mohly bránit aplikaci, která byla vytvořena v Visual Basic 2008, v kompilaci v Visual Basic 2010 nebo které mohou změnit chování aplikace za běhu.

Kategorie

Problém

Popis

Odvození typu pole

Pravidla pro odvozování inicializátorů pole se změnily.

Například Dim x() = {1, 2, 3} odvodí typ jako typ Integer.

Dim x() = {1, 2.2, "3"} způsobí chybu kompilátoru v případě, že Option Strict je nastavena na On.

V Visual Basic 2008, když deklarujete proměnnou pole, ale vynecháte typ elementu, kompilátor předpokládá, že typ elementu má být Object. Visual Basic 2010 zavádí odvození pro pole typů elementů a odvodí typ elementu, který má být dominantní typ pole literálů.

Není-li žádná dominantní typ, předpokládá se typ Object. V tomto případě pokud je Option Strict nastavena na hodnotu On, dojde k chybě kompilátoru.

Další informace naleznete v tématu Arrays in Visual Basic.

Konflikty pojmenování

Typy v oborech názvů importované na úrovni souborů mají přednost před typy v oborech názvů importovaných na úrovni projektu.

Pokud dva obory názvů obsahují typy se stejným názvem a pokud je jeden typ umístěn v oboru názvů importovaném na úrovni projektu a jiný typ se stejným název je umístěn v oboru názvů importovaném na úrovni souboru, Visual Basic 2010 vytvoří vazbu na typ v oboru názvů importovaném na úrovni souboru. Předchozí verze vázaly typ v oborech názvů importovaných na úrovni projektu. Další informace naleznete v tématu Imports Statement (.NET Namespace and Type).

Klíčová slova dotazu jako identifikátory

Použití klíčového slova dotazu jako identifikátor může vést k neočekávaným výsledkům.

Kompilátor Visual Basic přijímá klíčová slova jako názvy identifikátorů v různých kontextech. Z důvodu nových pravidel pro implicitní pokračování řádku přidaném v Visual Basic 2010, může dojít k chybě používáte-li klíčové slovo jako název prvku v LINQ dotazu, který vynechává znaky pokračování řádku.

Například následující příklad používá klíčové slovo Aggregate jako název identifikátoru. Pokud identifikátor aggregate ihned následuje za dotazem, považuje se za část dotazu z důvodu pravidel implicitního pokračování řádky pro klauzule dotazu. V tomto příkladu tento problém způsobí chybu kompilátoru.

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

Chcete-li zajistit, že řádek není implicitně zahrnut v předchozím řádku kódu, přidejte navíc zalomení řádku před řádek kódu, jak je znázorněno v následujícím příkladu.

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

    aggregate += 1

Další informace o implicitním pokračování řádku naleznete v tématu Statements in Visual Basic.

Moduly

Moduly jsou kompilovány jako MustInherit.

Moduly jsou nyní kompilovány jako MustInherit. Toto nastavení neovlivní chování modulu, ale může narušit kód, který používá reflexi k přezkoumání typů vytvořených v Visual Basic Module příkazu. Další informace naleznete v tématu Module Statement.

Lamdba výrazy

Anonymní lambda výrazy generují jedinečné typy.

Je nyní zajištěno, že typy anonymních delegátu generovány pro lambda výrazy, jsou jedinečné. Toto nastavení může ovlivnit kód, který je vyhodnocuje typy anonymních delegátů pro rovnosti, jako například kód v následujícím příkladu.

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

Další informace naleznete v tématu Lambda Expressions.

Odchylky v obecném rozhraní

S obecným rozhraním mohou vzniknout jisté nejasnosti.

Visual Basic 2010 v obecném rozhraní podporuje odchylky (kovariance a kontravariance). Můžete narazit na chybové upozornění týkající se nejednoznačných rozhraní v případě, že implementujete více rozhraní a jedno z rozhraní je odvozené z jiného.

Další informace naleznete v tématu Variance in Generic Interfaces (C# and Visual Basic).

Rozšířené metody

Místní metody jsou upřednostňovány před rozšířenými metodami.

Je-li rozšířená metoda definována jako metoda se stejným názvem a parametry jako metoda definována pro typ, kompilátor naváže místní metodu namísto rozšířené metody. Toto chování opravuje nesprávné chování vazeb v Visual Basic 2008. Další informace naleznete v tématu Extension Methods (Visual Basic).

Typy s možnou NULL hodnotou

Testovíní typu s možnou NULL hodnotou pro Nothing pomocí operátoru =, jak je ukázano v následujícím kódu, způsobí chybu kompilátoru.

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

Pokud testujete typ s možnou NULL hodnotou pro Nothing pomocí operátoru =, výsledek bude False i v případě, že typ s možnou NULL hodnotou je Nothing, což pravděpodobně není zamýšlený výsledek. Místo toho použijte operátor Is, jak je znázorněno v následujícím příkladu.

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

Implicitní volání funkcí a vlastností bez parametrů

Pokud funkce nebo vlastnost vrátí indexovatelnou hodnotu, například řetězec nebo pole, můžete použít zkrácenou syntaxi používající pouze index k odkazování na element v návratové hodnotě, v případě že neexistuje přetížení funkce nebo vlastnosti.

Funkce a vlastnosti bez parametru jsou ty, které vracejí indexovatelné hodnoty, stejně jak je ukázáno v následujícím příkladu.

Class Sample

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

End Class

Můžete použít zkrácený syntax používající pouze index k odkazování na element v návratové hodnotě stejně, jak je znázorněno v následujícím příkladu.

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

Visual Basic 2008 umožňuje tento zkrácený syntax v případě volání s pozdní vazbou i když existují přetížení pro funkce nebo vlastnost. V Visual Basic 2010 můžete použít zkrácené syntaxe používající pouze index k odkazování na element v návratové hodnotě pouze v případě, že neexistují přetížení funkce nebo vlastnosti.

Omezení Class

Omezení Class se již nepředpokládá.

Visual Basic 2008 odvodí omezení Class pro obecný parametr v případě, že je omezen druhým obecným parametrem, který je omezen omezením Class. Visual Basic 2010 již nepředpokládá, že obecný parametr "dědí" omezení Class. Důvodem je, že první obecný parametr může být vytvořen s typem, který implementuje rozhraní ale není třídou. Rozhraní splňuje omezení Class.

Chcete-li se ujistit, že obecný parametr je omezena jako třída, přidejte omezení Class stejně jak je znázorněno v následujícím příkladu.

    ' 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

Další informace naleznete v tématu Generic Types in Visual Basic.

Metody částečné třídy

Jestliže je metoda, která má omezené obecné parametry deklarována ve více než jedné dílčí třídě, všechny deklarace metody musí mít stejné omezení.

Můžete deklarovat metodu, která má obecné parametry ve více než jedné částečné třídě. V Visual Basic 2008, kompilátor někdy nevyžaduje aby omezení na obecných parametrech odpovídalo pro všechny deklarace metod. Visual Basic 2010 vyžaduje, aby všechny deklarace metoda měly stejné omezení.

Další informace naleznete v tématu Generic Types in Visual Basic.

Stromy výrazů pro lambda výrazy

Odebrání nepotřebných zabalení instancí obecný typů parametrů

Uvnitř stromu výrazů pro lambda výrazy v Visual Basic 2008 , je-li obecný typ parametru omezen na rozhraní, vyvolání metoda na instanci tohoto typu vždy zabalí tuto instanci. V Visual Basic 2010 je instance zabalena pouze v případě potřeby.

Další informace o zabalení a rozbalení naleznete v tématu Visual Basic Language Specification.

Lambdy výrazy a stromy výrazů

Strom výrazů pro lambda výraz může být vrácen ze stromu výrazů pro lambda výrazy.

V Visual Basic 2008, pokud lambda výraz přetypovává lambda výraz na strom výrazů, kompilátor v některých případech neprovádí přetypování. V Visual Basic 2010 kompilátor správně přetypovává lambda výrazy na strom výrazů v případě, že dojte k přetypování v rámci lambda výrazu.

Viz také

Koncepty

Co je nového ve Visual Basic 2010

Další zdroje

Začínáme s Visual Basic