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