Преобразования типов в C#

Необходимость в преобразовании экземпляров одного типа в другой возникает очень часто. В некоторых случаях компилятор выполняет такое преобразование неявно — когда значение одного типа присваивается переменной другого типа, и при этом не теряется точность и значение.

В случае если точность может быть утеряна, требуется явное преобразование. Для ссылочных типов правила преобразования аналогичны правилам преобразования указателей в С++.

Семантика преобразования типов подобна той, которая реализована в С++ и Java. Явные преобразования выполняются с применением знакомого синтаксиса приведения, который все они унаследовали от языка С, т.е. тип, к которому нужно преобразовать, помещается в скобках перед преобразуемым типом:

1
2
3
int defaultValue = 12345678;
long value = defaultValue;
int smallerValue = (int) value;

В этом коде приведение (int) должно быть явным, поскольку размер int меньше, чем long. То есть существует возможность того, что значение типа long не уместится в пространство, отведенное под int. Присваивание переменной defaultValue переменной value не требует приведения, поскольку long имеет больше места для хранения, чем int.

Если при преобразовании теряется значение, возможно, что эта операция сгенерирует исключение во время выполнения.

Общее правило гласит, что неявные преобразования гарантированно никогда не сгенерируют исключений, в то время как явные — наоборот, могут.

Язык С# предоставляет средства для определения пользовательских операций явного и неявного преобразования определенных пользователем типов к различным другим типам. Требования исключений для встроенных операций преобразования применимы к операциям преобразования, определенных пользователем.

В частности, операции неявных преобразований гарантированно никогда не генерируют исключений.

Преобразования к ссылочным типам и обратно моделируют аналогичные операции в Java, а также операции преобразования между указателями в С++. Например, ссылка на тип DerivedType может быть неявно преобразована к ссылке на тип BaseType, если DerivedType наследуется от BaseType.

Однако преобразование в обратном направлении должно осуществляться явно. К тому же явное приведение может сгенерировать исключение System.InvalidCastException во время выполнения программы, если CLR не сможет выполнить такое преобразование.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100