2013-07-29 1 views
5

조건이 param.days 인 경우 다음과 같습니다.C#에서는 왜 이것이 허용되지 않습니까?

if (param.days != null) 

이 잘 작동하지만 내가

If (param.days) 

을 말한다면 그것은 런타임에 제대로 평가하지 않습니다. C#에서는 두 문 모두 동일하지 않습니다.
값이 null이지만 C#이 nullable이 아닌 bool로 캐스팅하려고합니다. 왜 C# 디자이너가이 방법을 선택 했습니까? 이러한 진술은 C++에서 유효하지만 C#에서는 유효하지 않은 이유는 무엇입니까?

+11

null은 부울이 아닙니다. – Sayse

+4

'param.days'의 유형은 무엇입니까? –

+0

@Sayse : 예, 알았지 만, 제대로 평가되지 않은 다른 이유가 있습니다. 또는 bool이 nullable이 아닌 유형이므로 다른 방법이 없습니다. – ckv

답변

18

이러한 문은 C++에서 유효하지만 왜 C#을 다른 languange 규칙을 가정

때문에 C#에서 유효한 것으로 간주되지 않습니다. 0이 아닌지, null이 아닌지, null이 아닌지 검사하여 모든 숫자/참조가 부울로 취급 될 수 있다고 가정하지 않습니다. 무언가가 null인지 테스트하고 싶다면 :을 테스트하십시오.

참고 : days 사실 인 경우는 T? (일명 Nullable<T>), 당신은 확인할 수 있습니다

당신의 유형 이 현명하게 처리 할 수있는 경우,

또는 if(param.days != null)에 다음과 동일하다

if(param.days.HasValue) 

부울로, 컴파일러에게 알리기 위해 재정의 할 수있는 연산자가 있습니다.

1

C#에서 문은 브라커의 내용이 부울 식이어야합니다.

If ("Hello World")을 고려하십시오.

"Hello World"가 true 또는 false입니까? 둘 다 아니에요, 그것은 문자열입니다.

.days 속성에 개체 컬렉션이 포함되어 있으므로 .Any()과 같은 LINQ 식을 예로들 수 있습니다. 예 : If (myListOfCats.Any()).

+2

'if ("Hello World")'가 C++로 컴파일되기 때문에 이것은 끔찍한 예입니다. 이 질문은 C++과 C#의 차이점을 묻습니다. 따라서 실제로 대답하지 않습니다. – Dukeling

+3

그것은'C++ '이 아니며,'C#'입니다. – NibblyPig

+0

@Dukeling 당신은 C#이 C++에서 가능한 구문을 지원하지 않는 이유를 실제로 질문하고 있다고 주장 할 수 있습니다. –

1

if 문의 비교는 부울 결과로 평가해야합니다. param.days는 부울이 아닙니다. 부울 결과를 얻으려면 값을 null과 비교해야합니다. C#은 유형 안전합니다.

6

C++과 달리 C#은 암시 적으로 bool에 정수를 캐스팅하지 않습니다.

1

if의 비교 문은 boolean 결과가 필요합니다. param.days은 이 아니며 boolean입니다. C#은 암시 적으로 integerbool으로 캐스팅하지 않습니다.,

if (!string.IsNullOrEmpty(param.days)) 
{ 
} 

또는

if (param.days!=NULL) 
{ 
} 
5

명확히하려면 :

당신은 널 (null) 또는 그렇게이 코드를 시도하고 싶은 경우 boolean 결과 를 얻을 수 string.IsNullOrEmpty()를 사용하여 값을 비교해야 이것은 주석에서 수정안에 대한 대답입니다. C# 디자이너는 부울 평가에 null을 구현하지 않기로 선택하는 이유는 무엇입니까?

에릭 Lippert의 게시물 "null is not false"에서 발췌 :

일부 언어는 값 유형 또는 참조 유형 또는 모두 널 (null) 값을 허용, 암시 적으로 부울로 처리 할 수 ​​있습니다.

마찬가지로 null 값 유형에 대해서도 마찬가지입니다. 일부 언어에서는 null 값 유형이 암시 적으로 "false"로 처리됩니다.

C# 디자이너는 이러한 기능을 고려하여 거부했습니다. 먼저 참조 또는 null 입력 값 유형을 부울 (Boolean) 으로 처리하는 것은 혼란스러운 관용구이자 잠재적 인 풍부한 버그 소스입니다. 그리고 두 번째로는 의미 상으로는 null이 자동으로 번역됩니다. "이 값은 없습니다"또는 "이 값은 "입니다. -이 값은 논리적으로 거짓입니다.

이 특정 문장은 사용자의 string 예제를 다루지 만 암시적인 부울 평가가있는 다른 유형은 포함하지 않습니다.

그러나 부울로 평가되지 않는 정수와 같은 항목이 불량한 관용어이거나 지나치게 모호하다는 기치 아래 떨어지는 이유를 추측 할 수 있습니다.

관련 문제