Проверка нуля в сочетании с троичным выражением создает исключение NullReferenceException - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть следующие объекты:

class Parent
{
    public Child Child { get; set; }
}

class Child
{
    public string Type { get; set; }
    public int Value { get; set; }
}

Почему следующий код генерирует исключение NullReferenceException?

var value = parent.Child != null && 
            parent.Child.Type == "test" 
                ? parent.Child.Value == 1 
                : parent.Child.Value == 2;

Я думаю, что нулевая проверка блокирует вторую частьусловно от исполнения.Однако работает следующий код:

var value = (parent.Child != null) && 
            (parent.Child.Type == "test" 
                ? parent.Child.Value == 1 
                : parent.Child.Value == 2);

Так что я думаю, что здесь виноват какой-то приоритет оператора ...

1 Ответ

2 голосов
/ 23 сентября 2019

Почему бы не выбросить NullReferenceException?

var value = parent.Child != null && 
    parent.Child.Type == "test" 
        ? parent.Child.Value == 1 
        : parent.Child.Value == 2;

Давайте перепишем ваш код с временной переменной:

bool condition = parent.Child != null && parent.Child.Type == "test";
var value = condition ? parent.Child.Value == 1 : parent.child.Value == 2;

А затем с помощью оператора if, чтобы сделать этоеще яснее:

bool value = false;
bool condition = parent.Child != null && parent.Child.Type == "test";
if (condition)
{
    value = parent.Child.Value == 1;
}
else
{
    vaue = parent.Child.Value == 2;
}

Ваше условие требует выполнения двух условий: parent.Child не равно нулю, а parent.Child.Type равно "test".

Если ваше состояниеfalse, вы используете часть «else» троичного оператора: parent.Child.Value == 2.

Если ваше условие ложно из-за parent.Child == null, вы будете пытаться получить доступ к свойству объекта null в вашем else секция, таким образом вызывая NullReferenceException.

...