Метод класса, использующий switch с настройками по умолчанию, не все пути кода возвращают значение - PullRequest
0 голосов
/ 18 мая 2018

Использование очень простого класса с одним методом

Class Bagel{
    static [int] SwitchTest([int]$value){
        switch ($value){
            1 {return $value + 1}
            2 {return $value * 2}
            default{return 0}
        }
    }
}

Это не скомпилируется, потому что он получает ошибку с методом SwitchTest

Не все пути кода возвращаютзначение в методе.

Я полностью понимаю, что это значит.Где я нахожусь в тупике, какой путь может привести к сбою?default должен захватывать любое условие, не соответствующее верно?я могу устранить ошибку, если я изменю ее на следующее:

Class Bagel{
    static [int] SwitchTest([int]$value){
        switch ($value){
            1 {return $value + 1}
            2 {return $value * 2}
            default{return 0}
        }

        return -1
    }
}

Это выполняется просто отлично.Добавление этого последнего return кажется бесполезным для меня.Я не думаю, что это ошибка.Просто любопытно, если кто-то может дать мне знать, что я не понимаю по этому поводу.При каких условиях я могу получить последний статический метод для возврата -1?

Этот вопрос говорит о той же проблеме с циклом for.Я понимаю, почему это не работает.

1 Ответ

0 голосов
/ 18 мая 2018

В PowerShell switch фактически представляет собой цикл, поэтому его можно выполнить ноль раз. Это означает, что ни одно из предложений не будет выполнено, включая default один.

Хотя для [int] невозможно иметь значение, которое вызывает switch ноль раз, но с помощью точек останова PowerShell вы можете перехватить чтение переменной и заменить ее значение чем-то другим на лету:

Class Bagel{
    static [int] SwitchTest([int]$value){
        switch ($value){
            1 {return $value + 1}
            2 {return $value * 2}
            default{return 0}
        }

        return -1
    }
}

Set-PSBreakpoint -Variable value -Mode Read -Action {
    if($value -eq 42) {
        $v = Get-Variable value
        $v.Attributes.Clear()
        $v.Value = @()
    }
} | Out-Null

[Bagel]::SwitchTest(42)

tio.run

...