Здесь нужно учесть много вещей, но давайте сначала займемся самым простым:
Какой синтаксис (type)expression
?
Ну, в своей основной форме это считается кастингом. Вы приводите выражение от одного типа к другому. Вот и все.
Однако, что именно происходит, это зависит от типа и многих других вещей.
Если приведение типа значения к чему-либо другому, вы зависите от одного из двух задействованных типов, чтобы объявить оператор приведения, который обрабатывает это. Другими словами, либо тип значения должен определять оператор приведения, который может приводить к этому другому типу, либо этот другой тип должен определять оператор приведения, который может приводить из исходного типа.
То, что делает этот оператор, зависит от автора этого оператора. Это метод, поэтому он может делать что угодно.
Приведение типа значения к другому типу дает вам другое значение, отдельный тип значения или новый ссылочный тип, содержащий новые данные после приведения.
Пример:
int a = (int)byteValue;
Упаковка и распаковка вступают в игру, когда вы приводите тип значения в ссылочный тип и из него, обычно object
, или в один из интерфейсов, которые реализует тип значения.
* * Пример тысяча двадцать-один: * * 1 022
object o = intValue; // boxing
int i = (int)o; // unboxing
Бокс также вступает в игру при приведении к интерфейсу. Давайте предположим, что someValueType является структурой, которая также реализует IDisposable:
IDisposable disp = (IDisposable)someValueType; // boxed
Приведение ссылочного типа также может делать что-то еще.
Во-первых, вы можете определить те же операторы приведения, которые были задействованы в типах значений, что означает, что приведение одного ссылочного типа к другому может вернуть совершенно новый объект, содержащий информацию совершенно другого типа.
Бокс не вступает в игру при приведении ссылочного типа, если вы не приведете ссылочный тип обратно к типу значения (см. Выше).
* +1034 * Пример: * * одна тысяча тридцать пять
string s = (string)myObjectThatCanBeConvertedToAString;
Или вы можете просто переосмыслить ссылку, чтобы вы все равно ссылались на тот же объект, о котором идет речь, но смотрели на него через другую пару очков типа.
* +1039 * Пример:
IDisposable disp = (IDisposable)someDisposableObject;