다음 코드를 고려하십시오Nullable <T>의 null 전파가 T를 반환하고 Nullable이 아닌 <T>이 아닌 이유는 무엇입니까?
Nullable<DateTime> dt;
dt. <-- Nullable<DateTime>
dt?. <-- DateTime
널 전파 오히려 Nullable<T>
보다 T
을 반환합니다.
어떻게 그리고 왜?
다음 코드를 고려하십시오Nullable <T>의 null 전파가 T를 반환하고 Nullable이 아닌 <T>이 아닌 이유는 무엇입니까?
Nullable<DateTime> dt;
dt. <-- Nullable<DateTime>
dt?. <-- DateTime
널 전파 오히려 Nullable<T>
보다 T
을 반환합니다.
어떻게 그리고 왜?
?.
의 왼쪽에있는 객체가 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#을하지 않습니다로 생각할 수 있지만, 그것을 수행하는 동작입니다.
글쎄,'.Value'를 추가 할 때마다 값이있을 때만 호출된다면 무의미 할 것입니다. 그래서 아마도 그들은 해제 된 연산자처럼 조금 처리하기로 결정했을 것입니다. –