Microsoft MVP성태의 닷넷 이야기
시작하세요! C# 8.0 프로그래밍 책에 오타가 있는 것 같습니다. [링크 복사], [링크+제목 복사],
조회: 6929
글쓴 사람
guest
홈페이지
첨부 파일
 

830페이지에 예제 코드를 보면

    // NotNullWhen 특성의 생성자에 전달된 false에 따라
    // IsNull 메서드가 false를 반환하면 null이라고 C# 컴파일러가 인지
    static bool IsNull([NotNullWhen(false)] string? value)
    {
        if (value == null)
        {
            return true;
        }

        return false;
    }

이 예제 코드 주석에 "NotNullWhen 특성의 생성자에 전달된 false에 따라 IsNull 메서드가 false를 반환하면 null이라고 C# 컴파일러가 인지" 라고 설명이 돼 있는데요.
그런데 이 설명이 잘못 된 것 같습니다.
NotNullWhen 특성은 전달된 bool returnValue(예제 코드에서는 false로 전달함)에 따라 IsNull을 메서드가 false 반환하면
NotNullWhen 특성이 적용된 string? value 매개변수가 "null이 아니라고" C# 컴파일러가 인지해야 하지 않을까 생각이 됩니다.








[최초 등록일: ]
[최종 수정일: 9/10/2020]


비밀번호

댓글 작성자
 



2020-09-10 11시15분
사실, 도움말의 설명에 따라,

"Specifies that when a method returns "ReturnValue", the parameter will not be null even if the corresponding type allows it."

1차적으로는 그렇게 해석할 수 있습니다. 그런데 다음과 같은 경우를 테스트해 보면,

static bool IsNull([NotNullWhen(false)] string? value)
{
    Console.WriteLine(value.Length);
    return false;
}

C# 컴파일러는 언제나 false를 리턴하므로 도움말에 따르면, "string? value"를 C# 컴파일러가 충분히 null이 아닌 걸로 판정할 수 있었을 것입니다. 하지만, value.Length 코드에는 여전히 null 가능으로 인해 빨간색 밑줄이 그어집니다.

그러니까, IsNull이라는 메서드를 어떻게 정의하든 NotNullWhen 사용 유무에 따라 메서드 내의 코드에는 어떠한 영향력도 없는 것입니다. 그래서 자칫 메서드 내에서도 영향력을 발휘할 수 있을 것 같은 "string? value 인자가 null인지 아닌지"로 설명을 하기 보다는, 그 메서드를 호출하는 측면에서 "해당 메서드가 null 체크를 해준다는 힌트"를 컴파일러에게 해 준다는 것이 더 의미가 있으므로 그렇게 설명을 한 것입니다.
정성태
2020-09-11 12시07분
[guest] C# 너모 어려워요 ㅠㅠ
[guest]
2020-09-11 12시11분
그러게요, 이러다 정말 C# 언어를 Reboot 해야 하는 날이 오지 않을까 싶습니다. ^^
정성태

... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1526황상대1/26/201513526C# 마샬링 관련 질문이 있습니다. [1]
1525Ji-y...1/19/201512070시작하세요 C# 프로그래밍 도서에 관한 질문입니다. [1]
1523임종복12/31/201419462windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [3]
1524임종복1/4/201514377    답변글 [답변]: windows 2008 r2에서 ms-sql 2008 서버사용시 tls문제점 [2]
1521윤대욱12/19/201411924C++ 에서 서버와 클라이언트를 나누어서 구조체 전달에 대해서 궁금합니다. [1]파일 다운로드1
152012/10/201412294datetime관련해서요 [1]
1516aTo12/1/201411739wpf 배포관련. [3]
1514얄미운제리11/17/201413007[C# Mono]Mono Chart 개발 문의드립니다. [1]
1355미나리나물11/13/201410589RDP 접속 방식 질문드리고 싶습니다. [1]
1353송용국11/10/20149695TeamFoundationServer 에 소스를 Target서버로 옮기는(내려주는) 방법 있나요? [1]
1351blue...11/7/201414497c# webbrowser 모바일환경 접속 [1]
1350에메11/7/201413975WCF namedpipe 퍼블리싱 충돌 문제 [3]파일 다운로드1
1349Chun...11/6/201418773Microsoft. Net Framework 액세스 거부 오류...... [2]
1348김준석11/6/201414652 Mini dump 기록 안되는 현상 [2]파일 다운로드1
1346개미11/5/201429073https페이지에서 http서버에 있는 이미지 파일 호출시 보안 오류 [8]
1345장구니11/4/201412591AWS 인스턴스를 만들었는데 [1]
1343h11/2/201412455안녕하세요 [1]
1342왕초보11/1/201417468C#에서의 함수포인터 [13]
1347왕초보11/5/201412626    답변글 [답변]: C#에서의 함수포인터 [1]
1341영택10/29/201413440MFC Amazon S3 사용관련하여 질문드립니다. [2]
1344영택11/4/201410168    답변글 [답변]: MFC Amazon S3 사용관련하여 질문드립니다. [2]
1340감사합니다10/28/201414588c# wpf shdocvw internet explorer를 윈도우프레임으로 집어 넣을 수 있는지 궁금합니다. [3]파일 다운로드1
1338헬프미10/28/201415514tcp 소켓의 SYN_RECV 상태에 대하여 질문있습니다. [3]
1336이소정10/27/201411044filestream seek에 대해 질문있습니다. [1]
1337이소정10/28/201411032    답변글 [답변]: filestream seek에 대해 질문있습니다.파일 다운로드1
1339이소정10/28/201413915        답변글 [답변]: [답변]: filestream seek에 대해 질문있습니다. [2]파일 다운로드2
... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...