Как указывает ответ Матиаса Р. Джессена , PowerShell по умолчанию имеет нулевой условный режим доступа (пропускающий ноль) относительно доступа к свойству [1] * * 1 010;например, $noSuchVar.Prop
спокойно возвращает $null
ответ js2010 показывает связанный нуль-коалесцирующий оператор (??
) / ноль-условие-операторы (??=
), которые уже реализованы , хотя только как экспериментальная функция в PowerShell Core 7.0.0-preview.5.
Однако:
Невозможно условно игнорировать метод вызовы: $noSuchVar.Foo()
всегда терпит неудачу.
Точно так же невозможно игнорировать NULL (массив) индексирование : $noSuchVar[0]
всегда завершается неудачей.
Если вы выберетев * более строгом поведении с Set-StrictMode
, даже нулевое пропитывание доступа к свойству больше не является опцией: при Set-StrictMode -Version 1
или выше $noSuchVar.Prop
приводит к ошибке.
Начиная с PowerShell Core 7.0.0-preview.5, безусловные (пропускающие ноль) операторы запланированы , но еще не реализованы :
Как оВ этом письме согласно соответствующему RFC (после обсуждения в в этом выпуске ) операторы:
будут иметь такую же форму, какв C # в принципе (?.
и ?[...]
)
, но потребует включения имени переменной в {...}
То есть вы не сможете использовать только $A?.B
, вам придется использовать ${A}?.B
Причинаэтот громоздкий синтаксис состоит в том, что существует проблема обратной совместимости , потому что ?
является допустимым символом в именах переменных, поэтому гипотетически существующий код, такой как $var? = @{ one = 1}; $var?.one
, может сломаться без использования {...}
для устранения неоднозначностиимя переменной.
Если вы считаете, что не загромождать новый синтаксис важнее, чем потенциально нарушающие сценарии с именами переменных, заканчивающимися на ?
, сделает ваш голос услышанным на RFC .
[1] стандартное поведение PowerShell даже предлагает существование -условный доступ к недвижимости;например, $someObject.NoSuchProp
тихо возвращает $null
.