2017-01-20 5 views
4

저는 특히 null 전파에주의를 기울이고 있습니다. 이는 bool?bool 반환 방법을 사용하기 때문에 발생합니다.null 전파가 일관성없이 전파되는 이유 Nullable <T>?

public static bool IsAttributedWith<TAttribute>(this JsonProperty property) 
    where TAttribute : Attribute 
{ 
    return property?.AttributeProvider 
        .GetAttributes(typeof(TAttribute), false) 
        .Any(); 
} 

이 컴파일되지 않습니다, 다음과 같은 오류가 있습니다 :

암시 부울을 변환 할 수 없습니다 예를 들어, 다음을 고려? 부울에게. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까)?

이것은 내가이 .Any().GetValueOrDefault()을 말할 수 있다고 가정 것 같은 같은 bool? 같은 방법의 몸 전체를 치료되지만이 .Any() 반환 bool하지 bool?으로 허용되지 않는 것을 의미한다. 왜 못해,

public static bool IsAttributedWith<TAttribute>(this JsonProperty property) 
    where TAttribute : Attribute 
{ 
    return property?.AttributeProvider 
        .GetAttributes(typeof(TAttribute), false) 
        .Any() 
     ?? false; 
} 

또는

public static bool IsAttributedWith<TAttribute>(this JsonProperty property) 
    where TAttribute : Attribute 
{ 
    var any = 
     property?.AttributeProvider 
       .GetAttributes(typeof(TAttribute), false) 
       .Any(); 

    return any.GetValueOrDefault(); 
} 

또는

public static bool IsAttributedWith<TAttribute>(this JsonProperty property) 
    where TAttribute : Attribute 
{ 
    return property?.AttributeProvider 
        .GetAttributes(typeof(TAttribute), false) 
        .Any() 
     ?? false; 
} 

내 질문은 :

나는 내가 주위 작품으로 다음 중 하나를 수행 할 수 있다는 것을 알고있다 .Any() 호출에서 직접 .GetValueOrDefault() 체인을 호출합니까?

public static bool IsAttributedWith<TAttribute>(this JsonProperty property) 
    where TAttribute : Attribute 
{ 
    return (property?.AttributeProvider 
        .GetAttributes(typeof(TAttribute), false) 
        .Any()) 
        .GetValueOrDefault(); 
} 

나는 값이 실제로이 시점에서 bool?하지 bool 같이이 나을 것 같아요.

+1

당신은 이렇게 괄호를 넣어야을'.' 연산자 알려진 곳 조건 호출 체인 끝 :'(property? .AttributeProvider.GetAttributes (typett (TAttribute), false) .Any()). GetValueOrDefault()'. – PetSerAl

+0

'property'가 null의 경우, 메소드는 null를 돌려 주려고합니다. 그러나 반환 유형이 'bool'이므로 null 유형이 아닙니다. 반환 유형을'bool? '으로 변경하십시오. – Abion47

답변

5

?. 연산자 이후의 모든 호출 체인은 즉각적인 호출이 아닌 조건부 호출로 해석됩니다. ,

property==null ? (bool?)null : property.AttributeProvider 
             .GetAttributes(typeof(TAttribute), false) 
             .Any() 
             .GetValueOrDefault() 

가 실패합니다 Any() 반환 bool하지 bool? 때문에 : 그래서,이 코드는 : 당신이 GetValueOrDefault()을 추가하는 경우

property?.AttributeProvider 
     .GetAttributes(typeof(TAttribute), false) 
     .Any() 

property==null ? (bool?)null : property.AttributeProvider 
             .GetAttributes(typeof(TAttribute), false) 
             .Any() 

으로 해석했다.따라서 여기에 괄호를 사용해야합니다

(property==null ? (bool?)null : property.AttributeProvider 
             .GetAttributes(typeof(TAttribute), false) 
             .Any()) 
             .GetValueOrDefault() 

같은 괄호 당신이 ?. 연산자를 사용할 때 사용할 필요가 :

(property?.AttributeProvider 
      .GetAttributes(typeof(TAttribute), false) 
      .Any()) 
      .GetValueOrDefault() 
2

GetValueOrDefaultAny() 메서드를 호출하면 호출이 실행되고 bool을 반환합니다. 몸 전체의 결과에 대해 실행하려면 괄호로 묶어야합니다.

return (property?.AttributeProvider 
       .GetAttributes(typeof(TAttribute), false) 
       .Any()) 
       .GetValueOrDefault(); 

널 조건 연산자는 단락 연산자와 오브젝트가 널인 경우 실행되지 개체 또는 속성 또는 방법을 실행하려고하는 점의 우측에 따라서 아무것도이다. 따라서 전체 명령문에서 코드를 실행하려면 코드를 어떤 식 으로든 감싸 야합니다 (괄호 또는 다른 객체 사용).

+0

나는 당신을 괄호로 묶을 수 있음을 안다. 그러나 그것은 제가 구하는 것이 아닙니다. C#은 전체 문을'bool? '로 취급하지만'bool?'처럼 처리 할 수는 없습니다. 나는 그것이 무엇을 하는지를 안다. 나는 왜 그런지 묻는다. –