다음을 통해 공유


사용자 정의 명시적 및 암시적 변환 연산자

사용자 정의 형식은 다른 형식에서 또는 다른 형식으로 사용자 지정 암시적 또는 명시적 변환을 정의할 수 있습니다. 암시적 변환에는 특수 구문을 호출할 필요가 없으며 할당 및 메서드 호출과 같은 다양한 상황에서 발생할 수 있습니다. 미리 정의된 C# 암시적 변환은 항상 성공하며 예외를 throw하지 않습니다. 사용자 정의 암시적 변화도 이러한 방식으로 작동해야 합니다. 사용자 지정 변환이 예외를 throw하거나 정보가 손실될 수 있는 경우 이를 명시적 변환으로 정의합니다.

사용자 정의 변환은 isas 연산자에서 고려되지 않습니다. 캐스트 식을 사용하여 사용자 정의 명시적 변환을 호출합니다.

operatorimplicit 또는 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# 언어 사양의 다음 섹션을 참조하세요.

참고 항목