Microsoft MVP성태의 닷넷 이야기
시작하세요! C# 8.0 프로그래밍 책에 오타가 있는 것 같습니다. [링크 복사], [링크+제목 복사],
조회: 6596
글쓴 사람
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 해야 하는 날이 오지 않을까 싶습니다. ^^
정성태

... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4936무개1/3/20188843책 내용 인용하는 것에 관한 질문이있습니다. [1]파일 다운로드1
4935몬난아12/28/201711603IIS 및 ASP.NET 이 서버에서의 동작방식? [2]
4934Ques...12/26/201721995C# 해상도에 따른 자동 사이즈 조절방법이 궁금합니다. [3]
4933Kay12/15/20179289C# VS 버전 에러 질문 드립니다. [1]파일 다운로드1
4932정환나라12/13/20179183vs2013에서 빌드한 com 컨트롤 객체를 닷넷 2.0에서 사용하려 합니다 [4]
4931Arvid12/12/201710238Visual Studio 2012 c# using문 참조 에러 [5]파일 다운로드1
4929김성대12/8/20178684app.config에 관한질문입니다. [1]
4928김성대12/7/20179340SQL Server 설치에러에 대한 질문입니다. [1]파일 다운로드1
4926heyh...12/6/20178564[삭제] ContextSwitchDeadlock????
4925ho12/5/20179110[삭제] WebBrowser로 드롭박스 로그인 페이지 탐색 시 발생한 문제에 대해 질문 올립니다.파일 다운로드2
4924몽중언12/3/20179551C# 디버깅 모드에서만 DB Insert가 되는 현상 질의 [6]
4923고요한11/23/20179673파일 확장자에 연결된 프로그램을 등록하는 방법에 대한 질문입니다. [2]
4922박성훈11/23/201710626시작하세요! C# 7.1 학습 방법 [3]
4921초보개발자11/20/20177882[삭제] 폼 사이즈 질문드립니다.
4920Ques...11/19/20178997IEnumerable 의 "지연된 평가" 에 관하여 질문드립니다. [2]파일 다운로드1
4919mskim11/16/20179304Split()을 이용하여 문자 구분 시 구분문자도 같이 저장하는 방법이 있나요? [2]
4917ho11/16/20179927WPF XAML 트리거 관련해 문의 드립니다. [3]
4918ho11/16/201710223    답변글 [답변]: 예제 프로젝트 첨부합니다. [4]파일 다운로드2
4916필승11/11/20179886기본 웹 브라우저 체크는 어떻게 해야 하나요? [2]
4915필승11/10/20178950WebBrowser 컨트롤 소리 출력 문의 드립니다. [2]
4914Ques...11/10/20179645c# 버튼 이벤트에 관하여 질문드립니다. [2]
4913Arvid11/8/201712071Log4Net 라이브러리를 이용하여 특정 기간이 지났을 때 자동 로그 삭제 기능 구현 질문 드립니다! [2]
4912조범희11/8/201711742C# FTP 다운로드중 에러 발생.. [2]파일 다운로드1
4911필승11/6/201710165WebBrowser 컨트롤 사용법에 대해 궁금합니다. [2]
4910진우11/6/20179741람다 초보 질문 드립니다. [2]
4909필승11/5/201710720TextBox에 관해 질문 드립니다. [5]
... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...