Нулевое распространение - выполнение функции при проверке на ноль

Можно ли это реализовать с помощью оператора распространения Null (??)?

origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;

2 ответа

Решение

Нет, нулевое распространение здесь не поможет, потому что оно работает в направлении, противоположном тому, что вы хотите.

Он проверит, является ли первая часть нулевой, и только в этом случае запустите вторую часть. Я не могу представить, как вы это перевернете.

Но, как сказал @JohanP, гораздо лучше перенести эту проверку в вашу функцию:

public object GetObj(object input)
{
   if (input == null) return null;
   ....
}

origObj = GetObj(model.ProjectId);

Можно ли это реализовать с помощью оператора распространения Null (??)?

var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;

Прежде всего оператор ?? является нулевым оператором слияния. Если вы хотите использовать это, это просто означает, что если слева от ?? является нулевым, тогда сделайте правую сторону, иначе сделайте левую сторону Так что в вашем случае это не сработает, потому что если вы напишите это:

var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);

это будет означать: если model.ProjectId не является нулевым, присвойте его origObj, В противном случае присвойте возвращаемое значение из GetObj(model.ProjectId.Value) и он потерпит крах, потому что model.ProjectId нулевой.

Нулевой оператор распространения ? работает так: если левая сторона ? не является нулевым, тогда вызовите что-нибудь на этом. Например:

public class Foo
{ 
    public void Bar() {}
}

var foo = new Foo();
foo?.Bar();

В вашей ситуации с троичным оператором все будет хорошо. Но все зависит от типа возвращаемого GetObj метод. Если метод возвращается void тогда он не скомпилируется. Если метод возвращает тип примитива, то вам нужно привести его так, потому что обе ветви тернарного оператора должны возвращать один и тот же тип. Например, если GetObj возвращает bool тогда вам нужно это:

 var origObj = model.ProjectId != null 
     ? GetObj(model.ProjectId.Value) : 
     (bool?)null;

Попался

Наконец, если вы оставите нулевую проверку GetObj метод, вы можете в конечном итоге в беде, и ваша программа может произойти сбой, если GetObj метод такой:

public object GetObj(object value)
{
    if (value == null)
    {
        throw new InvalidOperationException("Cannot call with null");
    }
}
Другие вопросы по тегам