49. 사용자 정의 변환 연산자(implicit/explicit)와 오버로드 해석

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// 주제: 사용자 정의 변환 연산자(implicit / explicit operator)와 오버로드 해석의 상호작용.
//
// 과제:
//   1) 아래 프로그램의 표준출력(L1~L6)을 정확히 예측하라.
//   2) F(i)(i 는 int)에서 F(double) 과 F(Meters) 중 무엇이 선택되는지와 그 이유를 설명하라.
//   3) Meters m2 = 10; 이 왜 컴파일되는지("한 번의 사용자 정의 변환" 규칙)를 설명하라.
//   (변환·오버로드 규칙 설명은 answer.md 에만. 여기서는 예측만.)

using System;

struct Meters
{
    public double V;
    public Meters(double v) { V = v; }

    public static implicit operator Meters(double d) => new Meters(d); // double -> Meters (암시적)
    public static explicit operator double(Meters m) => m.V;           // Meters -> double (명시적)

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

class Program
{
    static string F(Meters m) => "F(Meters)";
    static string F(double d) => "F(double)";

    static void Main()
    {
        Meters m = 5.0;                 // 암시적 double -> Meters
        Console.WriteLine(m);           // L1

        double d = (double)m;           // 명시적 Meters -> double
        Console.WriteLine(d);           // L2

        Console.WriteLine(F(3.0));      // L3
        Console.WriteLine(F(m));        // L4

        int i = 7;
        Console.WriteLine(F(i));        // L5

        Meters m2 = 10;                 // m2 초기화
        Console.WriteLine(m2);          // L6
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.