Определяемые пользователем явные и неявные операторы преобразования

Пользовательский тип может определять неявное или явное пользовательское преобразование в другой тип или из него. Неявные преобразования не требуют вызова специального синтаксиса и могут возникать в различных ситуациях, например в вызовах назначений и методов. Предопределенные неявные преобразования на C# всегда завершаются успешно и никогда не вызывают исключение. Неявные пользовательские преобразования должны вести себя таким же образом. Если пользовательское преобразование может вызвать исключение или привести к потере данных, определите его как явное преобразование.

Определяемые пользователем преобразования не считаются операторами. Используйте выражение приведения для вызова явного пользовательского преобразования.

Используйте ключевые слова operator и implicit или explicit для определения явного или неявного преобразования соответственно. Тип, который определяет преобразование, должен быть типом источника или целевого объекта этого преобразования. Преобразование между двумя пользовательскими типами можно определить одним из двух типов.

Следующий пример иллюстрирует, как определить неявное и явное преобразования:

using System;

public readonly struct Digit
{
    private readonly byte digit;

    public Digit(byte digit)
    {
        if (digit > 9)
        {
            throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
        }
        this.digit = digit;
    }

    public static implicit operator byte(Digit d) => d.digit;
    public static explicit operator Digit(byte b) => new Digit(b);

    public override string ToString() => $"{digit}";
}

public static class UserDefinedConversions
{
    public static void Main()
    {
        var d = new Digit(7);

        byte number = d;
        Console.WriteLine(number);  // output: 7

        Digit digit = (Digit)number;
        Console.WriteLine(digit);  // output: 7
    }
}

Начиная с C# 11 можно определить проверенные операторы явного преобразования. Дополнительные сведения см. в разделе Проверенные операторы, определяемые пользователем статьи Арифметические операторы.

Можно также использовать ключевое слово operator для перегрузки предопределенного оператора C#. Для получения дополнительной информации см. раздел Перегрузка операторов.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

См. также