Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Понятно о Visual Basic.NET. Самоучитель.Ч2.2005...docx
Скачиваний:
46
Добавлен:
25.11.2019
Размер:
4.02 Mб
Скачать
      1. Соответствие типов

Мы с вами уже привыкли, что сочиняя программу, нужно немножко заботиться о соответствии типов. Соответствие типов должно выполняться не только для параметров методов, но и в операторе присваивания, где тип выражения справа от знака равенства должен соответствовать типу переменной слева от него. Поэтому, например, следующий фрагмент VB выполнит гладко и без малейших вопросов:

Dim a As Integer

Dim b As Integer = 99

a = b + 2

А вот при попытке выполнить следующий фрагмент

Dim a As Integer

Dim s As String = "Привет"

a = s

VB выдаст ошибку:

Cast from string "Привет" to type 'Integer' is not valid.

Переводится сообщение так:

«Преобразование строки "Привет" в тип Integer незаконно».

Действительно, в какое число можно превратить строчку текста? Нонсенс.

А зачем VB вообще что-то преобразовывал? А затем, что есть такое правило выполнения оператора присваивания:

Вычислив в операторе присваивания выражение справа от знака равенства, VB смотрит, совпадает ли его тип с типом переменной слева от него. Если совпадает – хорошо, а если не совпадает, то пытается преобразовать его тип к нужному (тому, что слева). Если удается – хорошо, а если из соображений правильности, точности, безопасности или из каких-то других своих соображений VB посчитает, что такое преобразование незаконно или ненужно, он выдает сообщение об ошибке.

Рассмотрим фрагмент:

Dim a As Integer

Dim b As Double = 1

a = b + 0.48

Он будет выполнен гладко, несмотря на то, что справа – Double, а слева – Integer. VB не возражает в данном случае преобразовать дробное число в целое. Несмотря на колоссальную потерю в точности (1 вместо 1.48), никаких сообщений или предупреждений мы не увидим. Это программист сам виноват, что объявил переменную целым типом.

Так же гладко выполнится и следующий фрагмент:

Dim a As Integer = 99

Dim s As String

s = a

Здесь VB преобразует число 99 в строку “99”.

Соответствие типов требуется и при вызове процедур и функций с параметрами.

При обращении к процедуре VB смотрит, совпадает ли тип параметра в обращении к процедуре с типом соответствующего параметра в заголовке объявления процедуры. Если совпадает – хорошо, а если не совпадает, то пытается преобразовать его тип к нужному (тому, что в объявлении). Если удается – хорошо, а если нет, VB выдает сообщение об ошибке.

В подтверждение этих слов достаточно вспомнить Методы, «придирчивые» к типу параметров (6.2.8).

Чтобы не было проблем, старайтесь объявлять переменные и параметры, между которыми должно соблюдаться соответствие, одинаковыми типами.

      1. Соответствие объектных типов

Все, что сказано в предыдущем подразделе о соответствии типов, полностью относится и к тому случаю, когда эти типы объектные.

При попытке ввести в окно кода следующий код

Dim A As Graphics

A = Label1

VB подчеркнет ошибку и подскажет:

Value of type 'System.Windows.Forms.Label' cannot be converted to 'System.Drawing.Graphics'

Переводится подсказка так:

«Значение типа Label не может быть преобразовано в тип Graphics».

Действительно, мы объявили переменную A объектным типом Graphics, а сами присвоили ей значение хоть и объектного типа Label, но не имеющего никакого отношения к графике. «Не садись не в свои сани».

Точно такая же подсказка, но уже по поводу параметров, появится, если мы к процедуре из 11.5.2:

Sub Рисуем_крестик(ByVal Гр As Graphics)

Гр.DrawLine(Pens.Blue, 100, 110, 120, 110)

Гр.DrawLine(Pens.Blue, 110, 100, 110, 120)

End Sub

обратимся с глупой ошибкой:

Рисуем_крестик(Label1)

а не как положено:

Рисуем_крестик(Графика_для_метки)