这可以使用 Null 传播运算符 (??) 来实现吗?
var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;
首先,?? 运算符是 Null Coalescing 运算符。如果你想使用它,它只是意味着如果?? 的左侧为空,则执行右侧,否则执行左侧。所以在你的情况下它不会起作用,因为如果你要写这个:
var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);
这意味着:如果model.ProjectId 不为空,则将其分配给origObj。否则,从GetObj(model.ProjectId.Value) 分配返回值,它会崩溃,因为model.ProjectId 为空。
Null Propagation 运算符? 的工作方式如下:如果? 的左侧不为空,则对其调用。例如:
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");
}
}