.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가 호출되었을 때 그 프로퍼티에 액세스 중이며 작업을 수행하기 때문에 예외가 발생합니다.
이 같은
덕분에 명확히하십시오 ,
사이 파반
내 생각에 int를 넣었습니까? (첫 번째 경우와 마찬가지로) Value 속성을 올바르게 호출해야합니까? 그런 시나리오에서는 HasValue가 false가되므로 예외를 발생시켜야합니다. 그 시나리오에서 어떻게 작동하는지 알려주시겠습니까? – usaipavan
@usaipavan HasValue는 절대 호출되지 않습니다. 왜냐하면'T? '에 대해 정의 된 연산자가 있기 때문에 null 연산자가 명시 적 연산자를 호출하지 않고 복사되기 때문입니다 (어쨌든 작동하지 않습니다). –