使用带默认触发器的开关的类方法并非所有代码路径都返回值

时间:2018-05-18 03:13:07

标签: powershell class powershell-v5.0

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

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?

This question讨论for循环的同一问题。我理解为什么那个不起作用。

1 个答案:

答案 0 :(得分:4)

在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