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.
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.
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.
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.
|
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.
|
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.
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.
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.
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