Назад Вперед Зміст

Неявне перетворення типів

У програмуванні часто значення змінних одного типу присвоюються змінним іншого типу. Наприклад, у наведеному нижче фрагменті коду ціле значення типу int присвоюється змінній з плаваючою точкою типу float:
  
int i; float f; i = 10;
f = i; //присвоїти ціле значення змінній типу float

Якщо в одній операції присвоєння змішуються сумісні типи даних, то значення правої частини оператора присвоєння автоматично перетворюється у тип, вказаний у лівій його частині. Тому в наведеному фрагменті значення змінної i спочатку перетворюється на тип float, а потім присвоюється змінній f. Але через суворий контроль типів далеко не всі типи даних у C# є повністю сумісними, отже, не всі перетворення типів дозволені у неявному вигляді.

Приведення типів

Перетворення несумісних типів все ж таки може бути здійснене шляхом приведення. Приведення типів означає їх явне перетворення.

Приведення - це команда компілятору перетворити результат обчислення виразу у вказаний тип. Нижче наведена загальна форма приведення типів:
(цільовий_тип) вираз

Тут цільовий_тип позначає той тип, у який бажано перетворити вказаний вираз.

Якщо приведення типів призводить до звужуючого перетворення, частина інформації може бути втрачена. Наприклад, при приведенні типу long до типу int частина інформації втратиться, якщо значення типу long виявиться більшим за діапазон представлення чисел для типу int, оскільки старші розряди цього числового значення відкидаються. Коли ж значення з плаваючою точкою приводиться до цілочислового, то внаслідок усічення втрачається дробова частина цього числового значення. Наприклад, якщо присвоїти значення 1,23 цілочисловій змінній, то в результаті в ній залишиться лише ціла частина вихідного числа (1), а дробова його частина (0,23) буде втрачена. Розглянемо приклад:

// Program.cs
// Головний клас програми
// Головний метод програми
static void Main(string[] args)
{
    // Ініціалізація змінних:
    int i1 = 255, i2 = 84500;  // Цілі числа типу int
    double d = 7.08845;         // Дійсне число типу double

    // Приведення типів:
    // 1. Перетворення int у byte (можлива втрата даних)
    Console.WriteLine((byte)i1);  // Виведе 255 (у межах byte)
    Console.WriteLine((byte)i2);  // Виведе лише молодші 8 біт (втрата даних)
    
    // 2. Перетворення double у int (відсікання дробової частини)
    Console.WriteLine((int)d);    // Виведе 7 (дробова частина втрачається)
    
    // Очікування натискання клавіші перед закриттям
    Console.ReadKey();
}

Зверніть увагу, що змінна i1 коректно перетворилася на тип byte, оскільки її значення входить у діапазон цього типу даних. Перетворення змінної d на тип int повернуло цілу частину цього числа. Перетворення змінної i2 повернуло значення переповнення.

Результат:

Використання класу Convert для приведення типів

Для перетворення до потрібного типу даних можна також використовувати клас Convert та його методи. Використання деяких методів показано у прикладі.

static void Main(string[] args)
{
    // Перетворення int у byte
    int i1 = 255;
    byte b1;
    b1 = Convert.ToByte(i1);  // Конвертація int до byte
    Console.WriteLine(b1);     // Виведе 255 (успішне перетворення)
    
    // Спроба перетворення int у byte (закоментувано, бо викличе помилку)
    // byte b2;
    // int i2 = 84500;
    // b2 = Convert.ToByte(i2);  // Викине виключення, бо значення занадто велике для byte
    // Console.WriteLine(b2);

    // Перетворення double у int (округлення до цілого)
    double d = 7.98845;
    int d1;
    d1 = Convert.ToInt32(d);  // Конвертація з округленням
    Console.WriteLine(d1);    // Виведе 8 (математичне округлення)

    // Перетворення double у string
    string st = Convert.ToString(d);  // Конвертація числа у рядок
    Console.WriteLine(st);           // Виведе "7.98845"

    // Перетворення string у int
    string s = "1234";
    int i = Convert.ToInt32(s);  // Парсинг рядка у ціле число
    Console.WriteLine(i);        // Виведе 1234

    Console.ReadKey();  // Очікування натискання клавіші
}

Результат:

Назад Вперед Зміст