HNQ 에서이 질문 을 읽은 후에 C # 8의 Nullable Reference Types에 대해 읽고 몇 가지 실험을했습니다.
나는 누군가가 "컴파일러 버그를 발견했다!"라고 말할 때 10에서 9 번, 또는 더 자주 알고 있습니다. 이것은 실제로 의도적으로 설계된 것이며 자체 오해입니다. 그리고 오늘만이 기능을 살펴보기 시작 했으므로 분명히 잘 이해하지 못합니다. 이 방법으로 다음 코드를 살펴보십시오.
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
나는 위의 링크 된 문서를 읽은 후, 나는 기대 s == null
라인이 나에게 줄 수있는 모든 후 경고- s
명확 Null을 허용하지 않는, 그래서 그것을 비교 null
이해가되지 않습니다.
대신 다음 줄에 경고가 표시되며 경고는 s
인간에게는 null 참조가 가능하지만 그렇지 않다는 것이 분명합니다.
더 이상 경고입니다 하지 우리가 비교하지 않는 경우 표시 s
에 null
.
나는 인터넷 검색을 수행하고 GitHub 문제에 부딪 혔습니다 . GitHub 문제 는 완전히 다른 것에 관한 것으로 밝혀졌지만 그 과정에서이 행동에 대해 더 많은 통찰력을 제공 한 기고자와 대화했습니다 (예 : "널 체크는 종종 유용한 방법입니다) 변수의 Null 허용 여부에 대한 그 이전의 추론을 다시 컴파일러를 말하는. " ). 그러나 여전히 주요 질문에 답하지 못했습니다.
나는 새로운 GitHub 이슈를 만들고, 매우 바쁘게 프로젝트 기여자들의 시간을 빼앗기지 않고 이것을 커뮤니티에 내놓고있다.
무슨 일이 일어나고 있으며 왜 그런지 설명해 주시겠습니까? 특히, 왜 경고는 생성되지 않습니다 s == null
라인, 우리는 왜해야합니까 CS8602
아닌 것 같아 때 null
참조가 여기에있다? 연결된 GitHub 스레드에서 알 수 있듯이 nullability 유추가 방탄이 아닌 경우 어떻게 잘못 될 수 있습니까? 그 예는 무엇입니까?
?
때문에 s
널 입력이 가능하지 않습니다. 단순히 우리와 비교하기에 어리석기 때문에 nullable이되지 않습니다 null
.