Есть ли эквивалент PowerShell для оператора C# по умолчанию, и если да, то каков синтаксис? - PullRequest
1 голос
/ 04 февраля 2020

В C# можно получить значение по умолчанию любого типа, используя оператор default :

var i = default(int); // i == 0

// in C# 7.1+
int j = default; // j == 0

Существует ли аналогичная конструкция в PowerShell, и если так что это? Насколько я смог определить в своем поиске и тестировании, default распознается PS только при наличии в switch блоках.

1 Ответ

1 голос
/ 04 февраля 2020

PowerShell не имеет прямой языковой конструкции для него, потому что он ему не нужен - из-за его свободной типизации вам почти никогда не требуется создавать значение определенного типа c, и нет никакой поддержки для создания generi c типов или функций. Нетипизированные переменные начинаются с $null, если вы не делаете ничего особенного. Типизированные переменные начинаются с любого значения, которое вы им явно указываете, и этого обычно достаточно из-за либеральных правил преобразования PowerShell ([int] "" и [int] $null оба 0).

Только в редких случаях это сбой, как попытка объявить переменную типа DateTimeOffset, так как нет конструктора по умолчанию и $null или "" не будут преобразованы. Возможно, исправление состоит в том, чтобы просто явно создать значение, используя то, что предлагает тип ([DateTimeOffset] $d = [DateTimeOffset]::Now, [DateTimeOffset] $d = [DateTimeOffset]::MinValue, [DateTimeOffset] $d = "0001-01-01 00:00Z"). Только в очень редком случае, когда у вас есть динамический тип c, и вы хотите получить то, что C# даст вам с default, вам потребуется специальный код. Вы можете сделать это в чистом PowerShell (ну, почти, нам нужно вызвать метод, доступный с тех пор. NET 1.0):

Function Get-Default([Type] $t) { [Array]::CreateInstance($t, 1)[0] }

И тогда [DateTimeOffset] $d = Get-Default DateTimeOffset работает (нет способа вывести введите в этом случае, хотя вы, конечно, можете опустить его из переменной).

Конечно, это создает массив мусора при каждом вызове; однако он не вызывает никаких конструкторов самого типа. Существуют более сложные подходы, которые избегают создания массивов, но все они включают усложнение с использованием обобщенных методов c (с использованием LINQ) или явную компиляцию C#, и их не стоит демонстрировать, поскольку они менее общие. Очевидно, что даже вышеприведенная функция должна использоваться только в необычном случае, когда она может понадобиться, а не в качестве общего способа инициализации переменных - обычно вы знаете тип и как его инициализировать, или вас не волнует тип во-первых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...