Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

6.1.7Преобразования упаковки

Преобразование упаковки обеспечивает неявное преобразование типа_значений в ссылочный тип. Существует преобразование упаковки из любого необнуляемого_типа_значений к типу object и dynamic, к System.ValueType, а также к любому типу_интерфейса, который реализуется необнуляемым_типом_значений. Кроме того, перечисляемый_тип может быть преобразован к типу System.Enum.

Преобразование упаковки из обнуляемого_типа к ссылочному типу существует только в том случае, если существует преобразование упаковки из базового необнуляемого_типа_значений к ссылочному типу.

Тип значений имеет преобразование упаковки к типу интерфейса T, при наличии типа преобразования упаковки к типу интерфейса T0 и наличии у T0 преобразования идентификатора к T.

Тип значений имеет преобразование упаковки к типу интерфейса T, при наличии типа преобразования упаковки к типу интерфейса или делегата T0 и наличии у T0 вариантов преобразований (§13.1.3.2) к T.

Упаковка значения необнуляемого_типа_значений включает в себя выделение экземпляра объекта и копирование этого значения типа_значений в указанный экземпляр. Структура может быть упакована в тип System.ValueType, поскольку он является базовым классом для всех структур (§11.3.2).

Упаковка значения обнуляемого_типа осуществляется следующим образом:

  • Если исходным значением является null (свойство HasValue имеет значение false), результатом является значение null конечного типа.

  • В противном случае результатом является ссылка на упакованное значение типа T, полученное в результате развертывания и упаковки исходного значения.

Дополнительные сведения о преобразованиях упаковки см. в §4.3.1.

6.1.8Неявные динамические преобразования

Существует неявное динамическое преобразование из выражения типа dynamic к типу T. При этом выполняется динамическая привязка преобразования (§7.2.2), что означает, что потребуется неявное преобразование во время выполнения из типа времени выполнения выражения к T. Если преобразования не обнаружено, во время выполнения создается исключение.

Обратите внимание, что это неявное преобразование противоречит совету, данному в §6.1, о том, что неявное преобразование не должно вызывать исключений. Однако по сути это не столько преобразование, сколько поиск преобразования, вызывающего исключение. Риск возникновения исключений во время выполнения является неотъемлемым при использовании динамической привязки. Если динамическая привязка преобразования не требуется, выражение можно сначала преобразовать к object, а затем к необходимому типу.

Следующий пример иллюстрирует неявное динамическое преобразование:

object o = “object” dynamic d = “dynamic”;

string s1 = o; // Fails at compile-time – no conversion exists string s2 = d; // Compiles and succeeds at run-time int i = d; // Compiles but fails at run-time – no conversion exists

Присвоения к s2 и i используют динамические преобразования, в которых привязка операции отложена на время выполнения. Во время выполнения требуются неявные преобразования из типа времени выполнения d – string – к целевому типу. Обнаруживается преобразование к string, а не к int.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]