Нулевое распространение - выполнение функции при проверке на ноль
Можно ли это реализовать с помощью оператора распространения 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");
}
}