Побочные эффекты, короткое замыкание и нулевой распространяющийся оператор вызова метода (?.)
Когда целевой объект является нулевым в условном доступе к члену / операторе распространения нулевого значения, а член является методом, оцениваются ли аргументы метода?
То есть в следующем коде 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());
}