2016-11-17 4 views
5

다음 코드를 고려하십시오Nullable <T>의 null 전파가 T를 반환하고 Nullable이 아닌 <T>이 아닌 이유는 무엇입니까?

Nullable<DateTime> dt; 

dt. <-- Nullable<DateTime> 
dt?. <-- DateTime 

널 전파 오히려 Nullable<T>보다 T을 반환합니다.

어떻게 그리고 왜?

+0

글쎄,'.Value'를 추가 할 때마다 값이있을 때만 호출된다면 무의미 할 것입니다. 그래서 아마도 그들은 해제 된 연산자처럼 조금 처리하기로 결정했을 것입니다. –

답변

5

?.의 왼쪽에있는 객체가 null 인 경우 null 전파가 작동하기 때문에 오른쪽에있는 객체는 실행되지 않습니다. 오른쪽면이 null이 될 수 없다는 것을 알기 때문에 Nullable을 편리하게 제거하므로 매번 .Value을 입력 할 필요가 없습니다.

당신은

public static T operator ?.(Nullable<U> lhs, Func<U,T> rhs) 
    where T: class 
    where U: struct 
{ 
    if(lhs.HasValue) 
    { 
     return rhs(lhs.Value); 
    } 
    else 
    { 
     return default(T); 
    } 
} 

위의 코드는 합법적 인 C#을하지 않습니다로 생각할 수 있지만, 그것을 수행하는 동작입니다.

+1

당신이 "Nullable을 제거합니다"라고 말할 때 본질적으로 통사론적인 설탕입니까? – series0ne

+0

예, 본질적으로 그 것입니다. 그것은'.Value' 호출을 당신을 위해 할 필요가 없도록합니다. –

+0

알겠습니다. 널 전파 연산자가 오버로드 될 수 없기 때문에 위의 코드가 작동하지 않는다고 가정하고 있습니까? – series0ne