다음을 통해 공유


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

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

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

operatorimplicitexplicit 워드를 사용하여 각각 암시적 또는 명시적 변환을 정의합니다. 변환을 정의하는 형식은 원본 형식이거나 해당 변환의 대상 형식이어야 합니다. 두 사용자 정의 형식 간의 변환은 두 형식 중 하나에서 정의할 수 있습니다.

다음 예제에서는 암시적 및 명시적 변환을 정의하는 방법을 보여 줍니다.

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

참고하십시오