Глава.5 .Примитивные,.ссылочные.и.значимые.типы
Пока компилятор позволяет пренебрегать явным приведением динамического
типа к другому типу данных, среда CLR на этапе выполнения проверяет правиль-
ность приведения с целью обеспечения безопасности типов. Если тип объекта не-
совместим с приведением, CLR выдает исключение
InvalidCastException
.
Обратите внимание на следующий код:
dynamic d = 123;
var result = M(d); // 'var result' - то же, что 'dynamic result'
Здесь компилятор позволяет коду компилироваться, потому что на этапе ком-
пиляции он не знает, какой из методов
M
будет вызван. Следовательно, он также не
знает, какой тип будет возвращен методом
M
. Компилятор предполагает, что пере-
менная
result
имеет динамический тип. Вы можете убедиться в этом, когда наведете
указатель мыши на переменную
var
в редакторе Visual Studio — во всплывающем
IntelliSense-окне вы увидите следующее.
dynamic: Represents an object whose operations will be resolved at runtime.
Если метод
M
, вызванный на этапе выполнения, возвращает
void
, выдается ис-
ключение
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
.
ВниМание
Не.путайте.типы.dynamic.и.var .Объявление.локальной.переменной.как.var.является.
синтаксическим.указанием.компилятору.подставлять.специальные.данные.из.со-
ответствующего.выражения .Ключевое.слово.var.может.использоваться.только.для.
объявления.локальных.переменных.внутри.метода,.тогда.как.ключевое.слово.dynamic.
может.указываться.с.локальными.переменными,.полями.и.аргументами .Вы.не.можете.
привести.выражение.к.типу.var,.но.вы.можете.привести.его.к.типу.dynamic .Вы.должны.
явно.инициализировать.переменную,.объявленную.как.var,.тогда.как.переменную,.
объявленную.как.dynamic,.инициализировать.нельзя .Больше.подробно.о.типе.var.
рассказывается.в.главе.9
При преобразовании типа
dynamic
в другой статический тип результатом будет,
очевидно, тоже статический тип. Аналогичным образом при создании типа с пере-
дачей конструктору одного и более аргументов
dynamic
результатом будет объект
того типа, который вы создаете:
dynamic d = 123;
var x = (Int32) d; // Конвертация: 'var x' одинаково с 'Int32 x'
var dt = new DateTime(d); // Создание: 'var dt' одинаково с 'DateTime dt'
Если выражение
dynamic
задается как коллекция в инструкции
foreach
или
как ресурс в директиве
using
, то компилятор генерирует код, который попытает-
ся привести выражение к необобщенному интерфейсу
System.IEnumerable
или
интерфейсу
System.IDisposable
соответственно. Если приведение типов вы-
полняется успешно, то выражение используется, а код выполняется нормально.
В противном случае будет выдано исключение
Microsoft.CSharp.RuntimeBinder.
RuntimeBinderException
.
Do'stlaringiz bilan baham: |