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

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

C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.

설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.

팁 (조언)

C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.

is 및 as 연산자는 사용자 정의 변환을 고려하지 않습니다. 캐스트 식을 사용하여 사용자 정의 명시적 변환을 호출합니다.

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
    }
}

확인된 명시적 변환 연산자를 정의할 수 있습니다. 자세한 내용은 산술 연산자 문서의 사용자 정의 검사 연산자 섹션을 참조하세요.

또한 키워드를 operator 사용하여 미리 정의된 C# 연산자를 오버로드합니다. 자세한 내용은 연산자 오버로드를 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고하십시오