Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи Програмування C_.doc
Скачиваний:
58
Добавлен:
18.12.2018
Размер:
1.44 Mб
Скачать

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

Розберемось, як мова С# суміщає у виразах змінні різних типів, тобто як відбувається перетворення типів, адже відомо, що у всіх виразах та операціях повинні використовуватись змінні однакових типів. З цією метою розглянемо наступний приклад.

using System;

namespace Convert_of_variables_1

{

class Program

{

static void Main()

{

float f = 0;

double x = f; // таке присвоєння припустиме

f = x; // а таке – ні

f = (float)x; // явне приведення типу

Console.WriteLine("f = " + f.ToString());

Console.WriteLine("x = " + x.ToString());

}

}

}

Змінній x типу double можна присвоїти значення змінної менш «потужного» типу, наприклад, типу float, тому що компілятор С# виконує неявне приведення типу (implicit convert), а от розраховувати, що автоматично буде виконане зворотне перетворення – неможливо. Адже при присвоєнні значень більш потужного типу змінній менш потужного типу можливі втрати інформації. Відповідальність за виконання таких операцій в разі їх потреби програміст повинен взяти на себе, необхідно виконати явне приведення типу (explicit convert). Така операція записується інструкцією:

(тип_до_якого_приводимо_вираз)вираз;

При обчисленні виразів, які містять операнди різних типів всі вони приводяться (звісно, якщо типи сумісні між собою) до найбільш широкого типу. Таке перетворення виконується неявним чином при дотриманні низки правил «просування по сходинках типів». При звуженні потужності типу завжди потрібне явне приведення типу. Правила просування є такими:

1. якщо один із операндів має тип decimal , то і другий буде приводитись до такого типу (але якщо другий операнд мав тип float або double, результат буде помилковим);

2. якщо один із операндів має тип double, то і другий буде приводитись до такого типу double;

3. якщо один із операндів має тип float, то і другий буде приводитись до типу float;

4. якщо один із операндів має тип ulong, то і другий буде приводитись до типу ulong (але якщо другий операнд мав цілий знаковий тип, результат буде помилковим);

  1. якщо один із операндів має тип long, то і другий буде приводитись до типу long;

  2. якщо один із операндів має тип uint, а другий має тип sbyte, short або int , то обидва операнди будуть приведені до типу long;

  3. якщо один із операндів має тип uint , то і другий буде приводитись до типу uint;

  4. Інакше обидва операнди перетворюються до типу int;

Останнє правило пояснює, чому в наступному коді виникає помилка.

using System;

namespace Convert_of_variables_2

{

class Program

{

static void Main()

{

byte b1 = 16, b2 = 32;

// нижче виникає помилка, оскільки згідно правилу 8,

// результат має тип int

byte b = b1 + b2;

Console.WriteLine("b = " + b.ToString());

}

}

}

Щоб код успішно компілювався та працював, треба виконати явне приведення результату до типу byte , який має змінна b:

byte b = (byte)(b1 + b2); // так правильно!