2012-10-27 4 views
3

.net 프레임 워크 소스 코드를 통과하여 Nullable 구조체 구현에 대한 명시 적 연산자 구현에서 실행되는 경우가있었습니다. 아래의 스크린 샷은 Value 속성의 구현과 명시 적 연산자의 구현을 보여줍니다. 또한 명시 적 운영자가 내 질문은 왜 다음 코드는 예외Nullable에 대한 명시 적 연산자 구현 <T> struct

프레임 워크 구현

 public T Value { 
     get { 
      if (!HasValue) { 
       ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue); 
      } 
      return value; 
     } 
    } 

public static explicit operator T(Nullable<T> value) { 
     return value.Value; 
    } 

손님 여러분 코드

int? i = null; 
int? i2 = (int?)i; //No Error 

int? i = null; 
int i2 = (int)i; //Runtime error 
를 던지고되지되지 않은 것을 Null 허용에서 T.로 변환하려고하는 것을 이해

ValueValue와 이상적으로 HasValue가 false가 될 것이기 때문에 (null을 할당 한 이후부터) 잘못된 연산 예외가 발생하지만 행복하게 값을 i2에 할당합니다. 그러나 (int?) 대신 (int) i로 변경하면 Value 속성에서 InvalidOperatorException이 발생합니다. 내 생각은 value.Value가 호출되었을 때 그 프로퍼티에 액세스 중이며 작업을 수행하기 때문에 예외가 발생합니다.

이 같은

덕분에 명확히하십시오 ,

사이 파반

답변

0

명시 적 연산자가 혼란 스러울 수 있습니다.

"명시 적 연산자"가 아니며 "명시 적 연산자 T"입니다. 귀하의 경우, 그것은 T가 int이기 때문에 "명시 적 연산자 int"가됩니다.

명시 적 연산자 int는 명시 적으로 int (단서의 이름이 ;-))로 변환되는 경우에만 호출됩니다.

그래서 i1은 int로 변환 할 필요가 없으며 명시 적 연 산자 int가 호출되지 않습니다.

2

당신이 int? 캐스팅하지 int

public static explicit operator T(Nullable<T> value) { 
    return value.Value; 
} 

Tint하지만 당신이 int?에 캐스팅되어 있기 때문에 그래서 Value은 (는) 최근까지 없었습니다. lled.

+0

내 생각에 int를 넣었습니까? (첫 번째 경우와 마찬가지로) Value 속성을 올바르게 호출해야합니까? 그런 시나리오에서는 HasValue가 false가되므로 예외를 발생시켜야합니다. 그 시나리오에서 어떻게 작동하는지 알려주시겠습니까? – usaipavan

+0

@usaipavan HasValue는 절대 호출되지 않습니다. 왜냐하면'T? '에 대해 정의 된 연산자가 있기 때문에 null 연산자가 명시 적 연산자를 호출하지 않고 복사되기 때문입니다 (어쨌든 작동하지 않습니다). –

1

int? i2 = (int?)i; //No Error의 경우 int?이 아닌 int으로 캐스팅 중이므로 명시 적 연산자 메서드가 호출되지 않습니다.

2
int? i2 = (int?)i; 

int?에서 int? 그냥 직선 복사 작업입니다. 변환 연산자가 없습니다. 이것은 struct 변수의 메모리 내용에 대한 플랫 복사본입니다.

관련 문제