Побочные эффекты, короткое замыкание и нулевой распространяющийся оператор вызова метода (?.)

Когда целевой объект является нулевым в условном доступе к члену / операторе распространения нулевого значения, а член является методом, оцениваются ли аргументы метода?

То есть в следующем коде g() называется?

SomeClass x = null;
x?.Foo(g());

Как насчет h() в:

SomeClass x = null;
x?.Bar($"h = {h()}");

SharpLab помещает оценку аргумента в if блок, поэтому он будет пропущен. Но гарантируется ли это спецификацией или деталями реализации?

1 ответ

Хотя вы могли бы легко попробовать, если или нет g выполнено, вот объяснение почему. Нулевой условный оператор является просто ярлыком для простого nullпроверять:

"[Нулевой условный оператор] Проверяет значение левого операнда для null перед выполнением членского доступа (?.) или индекс (?[]) операция; возвращается null если левый операнд оценивается как null".

Таким образом, ваш код эквивалентен следующему:

if(x != null)
{
    x.Foo(g());
}
Другие вопросы по тегам