0 不是 PowerShell 中的 [int]?

0 not an [int] in PowerShell?

我的理解是(数学上)0 是一个 Int。然而

if (0 -as [int]){"Int"}else{"Not"}

returns Not,至少对我来说 PS 2.0.

这是 v2 中的错误,还是我误解了什么? 我已经通过测试 -as [int] -and -ne 0 解决了这个问题,但感觉有点笨拙,所以我希望我在这里遗漏了一些东西并且有更好的答案。

仅供参考,我专门处理需要添加初始索引的种子计算机名称或需要递增索引的最后计算机名称。种子看起来像Lab 1-,初始索引可以是0,也可以是1,视情况而定。我一直在测试最后一个字符是 [int],知道 - 不会是一个整数。但是当第一台计算机是 Lab 1-00 因为初始索引是 0,我也不是 [int] 并且事情变得丑陋,下一台计算机是 实验室 1-0000。 同样,附加条件正在起作用,只是想知道我是否误解了我对 0 是 [int].

的期望

是的,0[int] 类型。您可以使用 GetType method:

亲自查看
PS > (0).GetType()    
IsPublic IsSerial Name                                     BaseType                  
-------- -------- ----                                     --------                  
True     True     Int32                                    System.ValueType          


PS > 

问题是您使用了错误的运算符。您使用 -is 来测试类型,而不是 -as:

PS > 0 -is [int]
True
PS > if (0 -is [int]) {"Int"} else {"Not"}
Int
PS > 

0 -as [int] 只是意味着 将 0 转换为 int。表达式的结果仍然是 0,隐式转换为 false.

相反,您想使用 0 -is [int],这意味着 is 0 an int 并且计算结果为 true

进一步阅读:get-help about_Type_Operators

编辑:

根据您在下面的评论,这里有一个示例,说明您如何评估最终字符是否可以转换为 int 而不 抛出异常:

function CheckLastChar($string){
    $var = 0
    $string -match ".$" | Out-Null

    if ([System.Int32]::TryParse($matches[0], [ref]$var)) {
        "It's an int!"
    }
    else {
        "It's NOT an int!"
    }
}
PS C:\> CheckLastChar("Lab 1-")
It's NOT an int!

PS C:\> CheckLastChar("Lab 1-000")
It's an int!

虽然,我不得不说 更好。

IF 测试是通过调用括号内的任何表达式,然后将结果计算为 [bool] 来执行的。

0 -as [int] 

returns 0. 当一个 [int] 被评估为 [bool] (true/false) 0 是 $false,所以测试总是失败。

从问题的描述来看,听起来您可能实际上是在测试字符串而不是 [int]。

  if ($var -as [int] -is [int]) {"Int"} else {"Not"}

应该在不抛出异常的情况下执行该测试。