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#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.