0

这可以使用 Null 传播运算符 (??) 来实现吗?

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

2 回答 2

3

不,零传播在这里对您没有帮助,因为它的工作方向与您想要的相反。

它将检查第一部分是否为空,并且仅在这种情况下运行第二部分。我无法想象你将如何反转它。

但正如@JohanP 所说,将检查移到您的函数中要好得多:

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

origObj = GetObj(model.ProjectId);
于 2017-06-14T01:08:34.350 回答
0

这可以使用 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返回 a bool,那么您将需要这个:

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

明白了

最后,如果您将 null 检查留给该方法,您可能会遇到麻烦,并且如果该方法如下所示GetObj,您的程序可能会崩溃:GetObj

public object GetObj(object value)
{
    if (value == null)
    {
        throw new InvalidOperationException("Cannot call with null");
    }
}
于 2017-06-14T01:14:32.283 回答