is
연산자가 약간 일치하지 않는 것 같습니다 .
bool Test()
{
// Returns false, but should return true.
return null is string;
}
null
값이 참조 (또는 널 입력 가능) 유형에 속할 것으로 예상합니다 . 실제로 C # 언어 사양은이 가설을 지원하는 내용을 말합니다 (6.1.6 암시 적 참조 변환).
암시 적 참조 변환은 다음과 같습니다.
…
• null 리터럴에서 모든 참조 유형으로.
의 설명 (7.10.10는 IS 연산자) is
표현식이 말하는하여 운영자 시작 (E is T)
에서 참조 변환 할 때 진정한 발생합니다 E
을이 T
존재하지만 저자가 때 명시하는 경우를 제외하여 갈 E
은 IS null
문자 또는이 null
값을 .
왜 그렇게합니까? 나에게는 그것은 직관이 아닌 것 같습니다.
답변
이 질문은 2013 년 5 월 30 일에 제 블로그 의 주제였습니다 . 좋은 질문 감사합니다!
당신은 빈 차도를 쳐다보고 있습니다.
누군가가 “차도에 혼다 시빅을 탈 수 있습니까?”라고 묻습니다.
예. 예, 그럴 수 있습니다.
누군가 두 번째 차도를 가리 킵니다. 또한 비어 있습니다. “내 차도의 현재 내용이 차도에 맞을 수 있습니까?”
그렇습니다. 두 차도 모두 비어 있습니다! 따라서 처음에는 내용이 없기 때문에 한 내용이 다른 내용에 잘 맞을 수 있습니다.
“차도에 혼다 시빅이 포함되어 있습니까?”
아니 그렇지 않아.
is
연산자가 두 번째 질문에 대답 한다고 생각합니다 . 이 값이 주어진다면 해당 유형의 변수에 적합합니까? 널 참조가이 유형의 변수에 적합합니까? 그렇습니다.
그것은 is
운영자가 대답 하는 질문이 아닙니다 . 것을 질문 is
연산자는 응답은 세 번째 질문입니다. y is X
요구하지 않는 것은 ” 인 y
유형의 변수의 유효한 값 X
? “그것은 “묻습니다 인가 y
형식의 개체에 대한 유효한 참조 X
? “널 참조가 유효한 참조하지 않기 때문에 어떠한 의 목적 어떤 종류, 대답은 ‘노’입니다 “. 그 차도는 비어 있습니다. 혼다 시빅이 포함되어 있지 않습니다.
그것을 보는 또 다른 방법은 y is X
“내가 말하면 y as X
, 널이 아닌 결과를 얻을 것인가?”라는 질문에 대답하는 것입니다.
질문을 좀 더 깊이 살펴 보려면 :
null 값은 참조 (또는 nullable) 유형에 속할 것으로 예상합니다.
하나는 암시 적으로 가정 될 타입 A는 값들의 세트 및 그 할당 호환 형 X의 변수 값 (Y)의하면 아무 이상도 이하이고 , y는 집합 X의 멤버인지 여부를 확인 .
이것이 형식을 보는 매우 일반적인 방법이지만 형식을 보는 유일한 방법은 아니며 C #이 형식을 보는 방법도 아닙니다. 널 참조는 C #에서 유형이없는 멤버입니다. 할당 호환성 은 단순히 집합에 값이 포함되어 있는지 확인하는 것이 아닙니다 . 널 참조가 참조 유형 X의 변수와 호환 가능한 대입 이라고해서 널이 X 유형의 멤버라는 의미는 아닙니다. “대입이 호환 가능”관계이고 “유형의 멤버”관계는 분명히 중복되지만 CLR에서는 동일하지 않습니다.
유형 이론에 대한 생각이 당신에게 관심이 있다면, 주제에 관한 최근 기사를 확인하십시오.
답변
나는 null is string
거짓을 돌려주는 것이 매우 직관적 이라고 생각 합니다. Null은 아무 의미가 없으며 문자열이 아닙니다. 따라서 false를 반환해야합니다. 언어 디자이너가 선택한 선택이지만 실제 세계의 의미를 고려할 때 매우 직관적입니다.
답변
null
문자가 할당 될 수있는 임의의 참조 유형. 그 자체로는 유형 이 아닙니다 . 널 참조 를 나타내는 특수 리터럴 입니다 .
전달 될 때 is
반환 되는 경우 리터럴 로 무엇을 할 수 있습니까? 아무것도 아닙니다 . 혼란스러운 문제를 제외하고는 돌아 오는 시점은 무엇입니까 ?true
null
null
null
true
어쨌든-직관적 인 측면에서 영어로 코드를 읽고 나에게 알려주십시오.
null is string;
내가 그것을 볼 때, 그것은 질문을하는 것 같습니다 is "nothing" a string?
. 내 직감은 그렇지 않다고 말해줍니다 nothing
.
답변
http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.71%29.aspx
다음 조건이 모두 충족되면 is 표현식은 true로 평가됩니다.
- expression이 널이 아닙니다.
- 표현식을 유형으로 캐스트 할 수 있습니다. 즉, 예외를 던지지 않고 형식 (표현식)의 캐스트 표현식이 완료됩니다. 자세한 내용은 7.6.6 캐스트 표현식을 참조하십시오.
답변
실질적으로 “null is T == false”를 사용하면 추가 코드를 입력하지 않아도됩니다.
말하지 말고
if (X != null && X is Foo) {}
그냥 말할 수 있어요
if (X is Foo) {}
그리고 그것으로 끝납니다.
답변
null
값
나는 이것이 문제의 핵심에 도달하는 것처럼 보이기 때문에 귀하의 질문에서 이것을 인용했습니다. 가치 null
가 아닙니다 -가치 가 없습니다 . is
나에게 의 목적은 질문에 대답하는 것 같습니다.
에 캐스팅
E
하면T
성공적으로T
?
지금, 당신은 동안 수 캐스트 null
에 T
오류없이 당신이 그렇게 후 하지 않는다 “는 없습니다 T
당신이 아직도있어 아무것도 -“를. 따라서 null
“is”는 T
그렇지 않으므로 is
false를 반환합니다.
답변
Java에는 정확히 같은 일을하는 연산자가 있지만 훨씬 긴 이름을 갖습니다 instanceof
. null instanceof String
null은 a의 인스턴스가 아니기 때문에 false 를 반환 하는 것은 매우 직관적 String
입니다. 따라서 사용할 때null
Java 버전을 좀 더 직관적입니다.
그러나이 두 연산자는 전체 계층 구조를 살펴볼 때도 true를 반환합니다. 예 : 의 인스턴스가있는 경우 String
입니다 Object
. 그리고 여기가 이제와 C # (인스턴스가 실제로 하나, 매우 특정 유형이 있기 때문에)의 덜 직관적 인 비트 것이 자바의 is
(모든이 있기 때문에 더 직관적 String
이다Object
깊은 내부).
결론 : 한 마디로 꽤 진보 된 논리를 묘사하려고하면이 방법으로 다른 사람들을 혼란스럽게 할 수밖에 없습니다. 대부분의 사람들은 하나의 의미에 동의 한 것으로 보이며 동의하지 않은 사람들은 조정해야했습니다.
