c# 널러블 변수를 이해하고 cs8604 경고를 없애는 방법

ComboBox.ObjectCollection.Add()는 널을 아규먼트로 받을 수 없다. 이 메서드에 널을 넣으면 애플리케이션이 멈춘다. 아래의 코드에서 method1에 널 아닌 값이 가더라도 컴파일러는 cs8604 경고를 보낸다. 의도하지 않은 상황에 널이 전달되어 애플리케이션이 멈추는 것을 막으려는 거다.

private void Form1_Load(object sender, EventArgs e)
{
    Method1(1);
}

private void Method1(object? object1)
{
    comboBox1.Items.Add(object1); // cs8604 warning
}

변수 오른쪽에 ?를 붙이면 널도 값으로 가질 수 있는 변수가 된다. 이걸 nullable variable이라 한다. 위 예제에서는 cs8604 상황을 일부러 만들기 위해서 object를 널러블로 만들었다. 경고를 없애려면 object?를 object로 바꿔서 non-nullable로 하면 된다. 하지만 이건 문제를 해결하는 게 아니라 문제를 만들지 않는 거라서 이 경고를 없애는 방법에서 제외한다.

이 경고를 없애는 제일 간단한 방법은 아규먼트가 널이 아니라고 확인해 주는 거다.

comboBox1.Items.Add(object1!);

변수 오른쪽에 !를 붙이면 이건 널이 아니라는 확인이다. 그러나 간단한 것들이 대체로 그렇듯 완전한 해결 방법은 될 수 없다. 아래 코드의 경우 경고는 사라지지만 실행을 하면 오류로 멈춘다. 널이 오지 않을 거라고 기껏 확인을 해서 경고는 없앴는데 실제로는 널이 올 수도 있기 때문이다.

private void Form1_Load(object sender, EventArgs e)
{
    Method1(null);
}

private void Method1(object? object1)
{
    comboBox1.Items.Add(object1!); // exception
}

이 문제를 근본적으로 해결하려 아래와 같이 조건문을 써야 한다.

comboBox1.Items.Add(object1! ?? string.Empty);

if를 써도 되지만 ?? 연산자를 쓰면 더 간단하다. 이거는 왼쪽 꺼가 널이 아니면 이걸 반환하고 널이면 오른쪽 꺼를 반환한다.

경고를 무시하도록 설정할 수도 있다.