C # 8의 Unknown Nullability는 무엇입니까?


12

C # 8.0에서는 널 입력 가능 참조 유형을 가질 수 있습니다. 문서 에는 네 가지 유형의 null 허용이 있다고 명시되어 있습니다. 처음 3 개는 명확하지만 "알 수 없음"의 요점을 이해하지 못합니다. 문서는 그것이 제네릭과 함께 사용된다고 말하지만 제네릭에서 제한되지 않은 T 유형의 변수에 대한 메서드를 호출하려고하면 유형이 nullable 인 것처럼 경고합니다. 알 수없는 것과 nullable의 차이점을 보지 못했습니다. 알 수없는 이유는 무엇입니까? 그것이 어떻게 나타 납니까?

답변:


12

다음과 같은 일반적인 방법을 사용하십시오.

public static T Get<T>(T value)
{
    return value;
}

우리가 그것을 호출 Get<string>(s)하면 리턴은 널 입력이 불가능하며 Get<string?>(s), 그렇게하면 널 입력이 가능하다.

이 같은 일반적인 인수를 요구하고있다 그러나 경우 Get<T>(x)T예를 들어, 해결되지는 아래처럼 일반적인 클래스에 대한 일반적인 인수입니다 ...

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // is result nullable or non-nullable? It depends on T
    }
}

여기서 컴파일러는 결국 널 입력 가능 또는 널 입력 불가능 유형으로 호출되는지 알 수 없습니다.

T널이 될 수 없다는 신호를 보내기 위해 사용할 수있는 새로운 유형 제한이 있습니다.

public static T Get<T>(T value) where T: notnull
{
    return value;
}

그러나 T제약이없고 여전히 열려 있는 곳 에서는 널 입력 가능성을 알 수 없습니다.

이러한 미지수가 널 입력 가능으로 취급되면 다음 코드를 작성할 수 있습니다.

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // reassign result to null, cause we we could if unknown was treated as nullable
        result = null;
    }
}

T널 입력이 불가능한 경우 경고가 표시되어야합니다. 따라서 알 수없는 nullable 유형을 사용하여 역 참조 할 때 경고를 표시하고 잠재적으로 할당을위한 경고를 원합니다 null.


내가 할 때 var result = Test.Get <T> (x); result.ToString (); 컴파일러는 가능한 null 값을 역 참조하는 것에 대해 불평합니다. 이 경우 단순히 nullable과 알 수없는 것이 어떻게 다른지 알 수 없습니다.
Stilgar

1
경고 측면에서 이들은 동일하게 동작하지만 의미 적으로 다릅니다. 당신은 그 차이가 학문적이라고 말할 수 있으며, 그것이 당신의 요점이라면 나는 동의합니다.
스튜어트

1
나는 왜 차이점이 도입되었는지 알고 싶습니다. 학문적 목적으로 언어에서 그러한 구별을 도입하는 것은 이상하게 보입니다.
Stilgar

내 나쁜, 그냥 사양을 다시 읽고 답변을 업데이트하고 마지막 부분에서 설명합니다.
스튜어트

1
아, 그게 더 좋아요
Stilgar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.