Поделиться через


Критические изменения в Visual Basic 2008

Обновлен: Июль 2008

В следующей таблице перечислены все изменения, которые могут заблокировать компиляцию в Visual Studio 2008 для приложения, созданного в Visual Studio 2005, или могут изменить его поведение во время выполнения.

Категория

Проблема

Описание

Обнуляемые типы

T расширенное до T? — предопределенное преобразование в Visual Studio 2008.

В Visual Studio 2005 можно создать определенное пользователем преобразование, чтобы позволить T расшириться до Nullable(Of T). В Visual Studio 2008 это преобразование является предопределенным, как часть расширенной поддержки встроенных типов.

Так как разрешена перегрузка и для предопределенных, и для определенных пользователем преобразований, то это потенциальная неоднозначность в случаях, когда присутствуют оба типа преобразований. Следовательно, код, содержащий определенное пользователем расширяющее преобразование из T в T? является потенциально неоднозначным в Visual Studio 2008.

Например, в следующем коде, вызов c3.Sub1 работает в Visual Studio 2005, но вызывает ошибку компиляции в Visual Studio 2008.

Чтобы устранить эту проблему, можно удалить определенное пользователем преобразование или явно привести к типу Class1 or Class2:

Разрешение перегрузки

Разрешение перегрузки, делающее различие между универсальными и не универсальными классами, было исправлено.

Ошибка в Visual Studio 2005 может вызывать поведение разрешения перегрузки для универсальных классов, отличное от поведения для не универсальных классов. В следующем примере классы Class1 и Class2 являются одинаковыми, за исключением того, что для класса Class2 определен универсальный параметр. Вызов c1.Sub1 в функции Main является неоднозначным, так как передаваемый аргумент может быть связан с перегрузкой Sub1 in Class1. Неоднозначность вызывает ошибку компилятора как в версии Visual Studio 2005, так и в версии Visual Studio 2008.

Вызову c2.Sub1 следовало бы вызывать такую же ошибку, но в версии Visual Studio 2005 этого не происходит. Вместо этого метод привязывается к неограниченной перегрузке Sub1 в классе Class2.

Эта проблема устранена в Visual Studio 2008. Оба вызова вызывают ошибку компилятора из-за неоднозначности. Это показано в следующем примере кода.

Чтобы устранить эту проблему, можно изменить перегрузки так, чтобы они более не являлись неоднозначными, или явно указать тип аргументов:

Разрешение перегрузки

Разрешение перегрузки с универсальными параметрами и с параметрами ParamArray приводит к различным результатам в Visual Studio 2008.

Цель разрешения перегрузки состоит в том, чтобы попытаться выбрать метод, чьи параметры наиболее близко совпадают с типами аргументов, которые передаются в метод. В примере этого подраздела, Sub1 является перегруженным при помощи иерархии наследования и вызывается с аргументами типа Integer и Short.

Правила разрешения перегрузки в Visual Studio 2005 и Visual Studio 2008, указывают, что прямое соответствие является более хорошим, чем то, которое требуется параметрами ParamArray. Однако, при использовании правил разрешения перегрузки Visual Studio 2005, определение типа вызывает ошибку для кандидата на перегрузку в производном классе, Class2, потому что Y не может одновременно иметь тип Integer и тип Short, а требуется точное соответствие. Если аргументы sh и n являются аргументами одного типа, вместо Sub1 в классе Class2 лучше использовать кандидата в классе Class1, который имеет параметр ParamArray. Однако поскольку два аргумента имеют различные типы, базовый класс, перегружаемый в класс Class1, используется вместо него. T задается как Integer, и Short расширяется до ParamArrayp.

Visual Studio 2008 использует новые алгоритмы, которые выбирают такие же перегрузки, как и в Visual Studio 2005, за исключением некоторых специфических случаев. В Visual Studio 2008 алгоритм определяет, что Integer является главным типом в этом примере, так как Short расширяется до Integer. Параметр типа Y в производном классе определяется как Integer, и Short расширяется до Integer. В результате Sub1 вызывается в производном классе.

Можно изменить поведение Visual Studio 2005 приведя переменную c2 к типу C1ass1 перед вызовом Sub1, или передав аргумент sh в виде массива.

См. также

Основные понятия

Разрешение перегрузки

Типы значения Null

Универсальные типы в Visual Basic

Ссылки

ParamArray

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Добавлен раздел.

Улучшение информации.