2014-12-11 11 views
2

long에서 MyCustomValueType까지 암시 적 캐스트 연산자를 사용하여 사용자 지정 값 형식 인 MyCustomValueType을 정의했습니다. Nullable에서 캐스트하는 방법 <T> 명시 적으로

public struct MyCustomValueType 
{ 
    private readonly long number; 

    public MyCustomValueType(long? number) 
    { 
     this.number = number.GetValueOrDefault(0); 
    } 

    public static implicit operator MyCustomValueType(long number) 
    { 
     return new MyCustomValueType(number); 
    } 
} 

그런 다음 컴파일러는 나에게 다음을 수행 할 수 있습니다 : 나는 방법을 알고 싶습니다

MyCustomValueType myCustomValueType = ((long?)null).Value; 

: 후드에서

// ... 
long? value = null; 
MyCustomValueType myCustomValueType = (MyCustomValueType)value; 
Console.WriteLine(myCustomValueType); 

을 컴파일러에 캐스팅으로 문을 변환 (또는 더 나은 이유는 무엇입니까?) 이런 일이 일어 났습니까? 왜 컴파일러는 아무도 정의되지 않은 명시 적 캐스팅을 허용합니다. 컴파일러는 어떤 규칙을 적용합니까?

public static explicit operator MyCustomValueType(long number) 

그러나 어떻게 든 그것을 이해 무엇 컴파일러 수용이 경우 :


또한 같은 MyCustomValueType 캐스팅 만 명시 적 연산자를 정의 할 때 등의 캐스팅도 가능하다는 것을 언급 아마한다 . 암시 적 연산자가있는 경우는 정말 혼란 스럽습니다. 누군가 설명해 주시겠습니까?

답변

5

컴파일러에서 명시 적 캐스팅을 허용하지 않는 이유는 무엇입니까? 컴파일러는 어떤 규칙을 적용합니까?

비에 비 - 널 값 유형 S로 변환하는 데 사용 정의 변환 연산자 주어 :

IT는 상승 전환는 C# 1 규격의 섹션 6.4.2에 정의 적용 null 값 유형 T이면 S?에서 T?으로 변환되는 해제 된 변환 연산자이 있습니다. 이 변환 조작은 직접 변환 널 값 S? 것을 제외 T에서 T?에 배치 하였다 TS에서 사용자 정의 변환 하였다 S?에서 S에 랩핑을 수행 해제 널 값 T?한다.

그래서 당신은 실제로 생각할 수 :

long? value = null; 
long tmp1 = (long) value;  // Unwrapping 
MyCustomValueType tmp2 = tmp1; // User-defined conversion 
MyCustomValueType? tmp3 = tmp2; // Wrapping 
MyCustomValueType myCustomValueType = (MyCustomValueType) tmp3; // Unwrapping 

나는 그것이, 특히 놀라운 정직하게 생각하지 않는다 - 당신이 뭔가를 할 때 가능한 것이라고 이해한다면, 특히 선언 된 변환 연산자가 이고 명시적인이면 선언 된 변환 연산자가 암시적인 일 때 동일한 사용이 가능할 것으로 기대됩니다. (물론 다른 방향 일 필요는 없습니다.)

+0

설명해 주셔서 감사합니다.이 코드는 Nullable 을 T로 변환하려고 의도 한 것입니다. –