티스토리 뷰

반응형

 

implicit, explicit 키워드는 암시적( implicit ) 또는 명시적( explicit ) 변환을 정의할 때 사용된다. 암시적 변환은 특별한 구문을 호출할 필요가 없으며 할당 및 메서드 호출과 같은 다양한 상황에서 사용할 수 있다. 미리 정의된 암시적 변환은 항상 성공하도록 구현되어 예외를 던지지 않으며 사용자가 정의하는 암시적 변화도 동일하게 작동해야 한다. 만약 변환할 때 예외를 던지거나 정보가 손실될 수 있는 경우에는 명시적 변환으로 정의해야 한다.

(위와 같이 가이드한 것은 암시적 변환을 사용했을 때 문제가 발생하면 디버깅하는 것이 어려워지기 때문으로 생각된다.)

 

사용자가 정의한 명시적 및 암시적 변환은 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();
        }
        this.digit = digit;
    }

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

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

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

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

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

C# 11부터 확인된 명시적 변환 연산자를 정의할 수 있고 operator 키워드를 사용하여 미리 정의된 C# 연산자를 오버로드한다.

 

 

참고 : 

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/user-defined-conversion-operators

 

 

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30