0Pricing
C# Academy · Урок

Неявные и явные преобразования

Безопасно преобразуйте совместимые типы.

«Неявные и явные преобразования» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Типы значений и ссылочные типы
  2. Упаковка и распаковка
  3. Неявные и явные преобразования
  4. Класс Convert и разбор значений
← Назад к C# Academy