C# 当null条件运算符短路时,它是否仍然计算方法参数?

C# 当null条件运算符短路时,它是否仍然计算方法参数?,c#,c#-6.0,null-conditional-operator,C#,C# 6.0,Null Conditional Operator,null条件运算符可用于跳过对null目标的方法调用。在这种情况下,是否要计算方法参数 例如: myObject?.DoSomething(GetFromNetwork()); 当myObject为null时调用了GetFromNetwork?它们将不会被计算 class C { public void Method(int x) { Console.WriteLine("Method"); } } static int GetSomeValue()

null条件运算符可用于跳过对null目标的方法调用。在这种情况下,是否要计算方法参数

例如:

myObject?.DoSomething(GetFromNetwork());

myObject
null
时调用了
GetFromNetwork

它们将不会被计算

class C
{
    public void Method(int x)
    {
        Console.WriteLine("Method");
    }
}

static int GetSomeValue()
{
    Console.WriteLine("GetSomeValue");
    return 0;
}

C c = null;
c?.Method(GetSomeValue());
这不打印任何内容。Resharper将
GetSomeValue()
的计算标记为死代码:

基本相当于

var temp = myObject;
if (temp != null) {
    temp.Method();
}
您可以看到,如果
myObject
null
,则无法计算任何参数


请注意,如果将
myObject
替换为

,则它们并不等效。具体来说,前者只对
对象
求值一次,如果非
null
,则对后者求值两次。因为它们不是等价的,所以不应从中得出结论。@hvd它们是等价的。甚至在规范中也有这样的规定(字面意思!)。由于它是一个变量,因此不存在双重评估。它们不是一般的,正如您链接到的规范中所述:“除了P只评估一次。”,后面的“除了P只评估一次。”,但后面的“除了P只评估一次。”,最后的“除了a.b和a.b[0]只评估一次。”和“除了a.b和a.b[0]只评估一次。”是的,对于局部变量,双重计算不会更改结果。这是唯一的例外,这将是对你的回答的一个很好的补充。
var temp = myObject;
if (temp != null) {
    temp.Method();
}