✅ CS8602 경고
null 가능 참조에 대한 역참조입니다.
무슨 말인지 해석하기도 어려운 오류입니다.
마이크로소프트의 공식 문서를 찾아봐도 이해할 수 없습니다.
오늘 언급하는 내용은 일반적인 문법의 오류는 아니고 nullable이 적용되면서 발생하는 현상이라고 봅니다.
nullable은 null로 인한 오류를 막기 위해 C#에 도입된 개념인데 참 피곤한 녀석이죠. 그렇다고 무시하기엔 찝찝합니다.
아래와 같은 코드가 있습니다.
internal class Program
{
public class TestClass
{
private bool _isbool;
public bool Isbool {
get => _isbool;
set => _isbool = value;
}
public TestClass() { }
}
static void Main(string[] args)
{
List<TestClass> tempList = new List<TestClass>();
for (int i = 0; i < 100; i++)
{
tempList.Add(new TestClass() { Isbool = false });
}
for (int i = 0; i < tempList.Count; i++)
{
tempList[i].Isbool = false;
}
}
}
아무런 문제도 코드입니다. 하지만 TestClass 객체에 null 이 들어가면 파란 줄이 생기기 시작합니다.
null을 허용하는 형식, 즉 nullable로 선언되지 않았기 때문인데 그럼 TestClass를 nullable로 변경합니다.
그러면 이제 다른데서 파란 줄이 생깁니다.
tempList [i]에 CS8602 가 생깁니다.
tempList [i]가 nullable인데 null 일 경우에는 null에 값을 넣게 되기 때문에 문제가 발생할 가능성이 있습니다.
그러면 어떻게 해야할까요?
!
((TestClass)tempList[i]).Isbool = false;
이렇게 nullable이 아닌 형태로 형변환을 해도 적용되지 않습니다.
의외의 키워드가 있습니다.
'!'를 사용하면 됩니다.
tempList[i]!.Isbool = false;
'!'는 일회성으로 nullable을 제거하는 기능을 합니다.
nullable로 선언된 변수, 객체에 값을 할당할 때는 '!'를 사용하면 됩니다.
번외
공식 문서에는 CS8602에 대한 아래 코드를 예제 코드로 공개하고 있습니다.
class Container
{
public List<string>? States { get; set; }
}
internal void PossibleDereferenceNullExamples(string? message)
{
Console.WriteLine(message.Length); // CS8602
var c = new Container { States = { "Red", "Yellow", "Green" } }; // CS8670
}
조금 이상하네요.
✅ CS8602 경고 - 끝
