Неявные и явные преобразования
Безопасно преобразуйте совместимые типы.
«Неявные и явные преобразования» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Преобразование между типами
В C# можно преобразовывать один числовой тип в другой. Некоторые преобразования выполняются автоматически (неявные), а для других требуется явное приведение.
using System;
class Program
{
static void Main()
{
int i = 10;
double d = i; // implicit
int back = (int)d; // explicit
Console.WriteLine(d + ", " + back);
}
}Неявные (расширяющие) преобразования
Неявное преобразование разрешено, когда данные не могут быть потеряны, например при преобразовании int в long или int в double. Приведение не требуется.
using System;
class Program
{
static void Main()
{
int i = 42;
long l = i; // widening, safe
double d = i; // widening, safe
Console.WriteLine(l + ", " + d);
}
}Почему расширение безопасно
Целевой тип может представить любое значение исходного типа, поэтому компилятор разрешает такое преобразование без дополнительных указаний.
using System;
class Program
{
static void Main()
{
byte b = 200;
int i = b; // byte fits in int
Console.WriteLine("byte " + b + " -> int " + i);
}
}Явные (сужающие) преобразования
Явное преобразование (приведение) требуется, когда данные могут быть потеряны, например при преобразовании double в int. Запись выглядит так: (int)value.
using System;
class Program
{
static void Main()
{
double d = 9.78;
int i = (int)d; // truncates toward zero -> 9
Console.WriteLine(i);
}
}Приведение усекает, а не округляет
При приведении числа с плавающей точкой к целому типу дробная часть отбрасывается, а не округляется. Если нужно округление, сначала используйте Math.Round.
using System;
class Program
{
static void Main()
{
double d = 7.99;
Console.WriteLine("Cast: " + (int)d);
Console.WriteLine("Round: " + (int)Math.Round(d));
}
}Переполнение при сужении типа
Если значение не помещается в целевой тип, обычное приведение может незаметно привести к циклическому переходу значения. Чтобы вместо этого при переполнении возникало исключение, используйте checked.
using System;
class Program
{
static void Main()
{
int big = 300;
byte wrapped = (byte)big; // 300 wraps to 44
Console.WriteLine("Wrapped: " + wrapped);
try
{
byte safe = checked((byte)big);
Console.WriteLine(safe);
}
catch (OverflowException)
{
Console.WriteLine("checked caught overflow");
}
}
}Потеря точности
Даже некоторые расширяющие преобразования, например преобразование очень большого long в float, могут привести к потере точности, хотя по-прежнему являются неявными.
using System;
class Program
{
static void Main()
{
long big = 9007199254740993L;
double approx = big; // implicit, may lose precision
Console.WriteLine("long: " + big);
Console.WriteLine("double: " + approx.ToString("F0"));
}
}Символьный тип и числовые преобразования
char неявно преобразуется в свой числовой код, а число можно явно привести обратно к типу char.
using System;
class Program
{
static void Main()
{
char c = 'A';
int code = c; // implicit -> 65
char next = (char)(code + 1); // explicit -> B
Console.WriteLine(code + " -> " + next);
}
}Преобразования в выражениях
В смешанной арифметике типы меньшего диапазона автоматически преобразуются к типу большего диапазона до выполнения операции.
using System;
class Program
{
static void Main()
{
int a = 7;
double b = 2;
double result = a / b; // a promoted to double -> 3.5
Console.WriteLine(result);
}
}Проблема целочисленного деления
Если оба операнда являются целыми числами, выполняется целочисленное деление. Сначала приведите один из операндов к double, чтобы получить дробный результат.
using System;
class Program
{
static void Main()
{
int a = 7, b = 2;
Console.WriteLine("int / int: " + (a / b));
Console.WriteLine("with cast: " + ((double)a / b));
}
}Объединяем всё вместе
Используйте неявные преобразования, когда они безопасны, явные приведения — при сужении типа, а также учитывайте усечение, переполнение и целочисленное деление.
using System;
class Program
{
static void Main()
{
int total = 17, count = 5;
double average = (double)total / count; // cast to avoid integer division
int rounded = (int)Math.Round(average);
Console.WriteLine("avg=" + average + ", rounded=" + rounded);
}
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете преобразования.
Повторение
Неявные (расширяющие) преобразования выполняются автоматически, когда данные не теряются (из int в целое число большего диапазона, из int в число двойной точности). Для явных (сужающих) преобразований нужно приведение, например (int)x, и они могут привести к усечению или переполнению. Используйте checked, чтобы обнаруживать переполнение, и приводите значения к double, чтобы избежать целочисленного деления.
using System;
class Program
{
static void Main()
{
double d = 3.9;
int i = (int)d; // explicit, truncates to 3
long l = i; // implicit widening
Console.WriteLine(i + ", " + l);
}
}Часто задаваемые вопросы
Урок «Неявные и явные преобразования» бесплатный?
Да — полный текст урока «Неявные и явные преобразования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Неявные и явные преобразования»?
Безопасно преобразуйте совместимые типы. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Неявные и явные преобразования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типы значений и ссылочные типы
- Упаковка и распаковка
- Неявные и явные преобразования
- Класс Convert и разбор значений