В С# предусмотрен очень простой механизм для преобразования структурного типа в ссылочный. Он получил название упаковки (boxing). Пусть у нас переменная простого структурного типа данных – short.
short s = 25;
object objShort =s; //упаковываем
При этом в управляемой куче создается новый объект и в него копируются внутренние данные старого объекта из стека.
Противоположная операция назвывается распаковкой (unboxing). Распаковка это преобразование ссылки на объект в оперативной памяти обратно в сруктурный тип. Перед выполнением распаковки среда выполнения производит проверку на совместимость между типом объекта в оперативной памяти и тем структурным типом, в который будет производится распаковка.
short anyShort = (short)objShort;
Если среда выполнения обнаружит, что производится распаковка в недопустимый тип данных, то будет сгенерировано исключение InvalidCastException.
object Back(object any){
return(any);
}
/// Неявное преобразование аргумента в тип object
/// Явное приведение типа результата.
public void BackTest() {
int x = 11;
uint ux = 1111;
float y = 5.5f;
string s = "Hello!";
string s1 = "25";
ux = (uint)Back(ux);
WhoIsWho("ux",ux);
s1 = (string)Back(s);
WhoIsWho("s1",s1);
x =(int)(uint)Back(ux);
WhoIsWho("x",x);
y = (float)(double)Back(11 + 5.55 + 5.5f);
WhoIsWho("y",y);
}
Объекты одного типа могут быть преобразованы в объекты другого типа неявно или явно. Неявные преобразования происходят автоматически, компилятор делает это вместо вас. Явные преобразования осуществляются, когда вы сами «приводите» значение к другому типу. Неявные преобразования гарантируют также, что данные не будут потеряны. Например, вы можете неявно приводить от short (2 байта) к int (4 байта). Независимо от того, какой значение находится в short, оно не потеряется при преобразовании к int:
short x = 1 ;
int у = х; //неявное преобразование
Если вы делаете обратное преобразование, то, конечно же, можете потерять информацию. Если значение в int больше, чем 32767, оно будет усечено при преобразовании. Компилятор не станет выполнять неявное преобразование от int к short:
short х;
int у = 5;
х = у; //не скомпилируете
Вы должны выполнить явное преобразование, используя оператор приведения:
short х;
int у = 5;
х = (short) у; //OK
Рассмотрим преобразования для арифметических типов на схеме 1. Если на диаграмме задан путь (стрелками) от типа А к типу В, то это означает существование неявного преобразования из типа А в тип В. Все остальные преобразования между подтипами арифметического типа существуют, но являются явными.