Class 使用带有默认触发器的开关的方法不是所有代码路径 returns 值

Class method using switch with default triggers not all code paths returns value

使用一个非常简单的class和一个方法

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

这不会编译,因为它在使用方法 SwitchTest

时出错

Not all code path returns value within method.

我完全明白那是什么意思。我难过的地方是什么路径会导致失败? default 应该捕获任何不匹配的条件吗?如果我把它改成这样,我可以让错误消失:

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

        return -1
    }
}

这执行得很好。添加最后一个 return 似乎 对我没用。我不认为这是一个错误。只是好奇是否有人可以让我知道我对此一无所知。在什么情况下我可以将最后一个静态方法获取到 return -1?

This questionfor 循环讨论同样的问题。我明白为什么那个不起作用。

在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