0而不是PowerShell中的[int]?

Gor*_*don 3 powershell integer zero

我的理解是(数学上)0是Int.但是

if (0 -as [int]){"Int"}else{"Not"}
Run Code Online (Sandbox Code Playgroud)

回归Not,至少对我来说是PS 2.0.

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

仅供参考,我专门处理需要添加初始索引的种子计算机名称或需要增加索引的最后一个计算机名称.种子看起来像Lab 1-,初始索引可以是0或者可以是1,具体取决于具体情况.我只是在测试最后一个角色[int],知道 - 不会是一个int.但是当第一台计算机是实验室1-00因为初始索引为0时,我也得不到[int]而且事情变得很难看,下一台计算机是Lab 1-0000.再一次,额外的条件是有效的,只是想知道我是否误解了我的期望0是一个[int].

iCo*_*dez 8

是的,0属于类型[int].您可以使用以下GetType方法自己查看:

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


PS > 
Run Code Online (Sandbox Code Playgroud)

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

PS > 0 -is [int]
True
PS > if (0 -is [int]) {"Int"} else {"Not"}
Int
PS > 
Run Code Online (Sandbox Code Playgroud)


Nac*_*ota 5

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!"
    }
}
Run Code Online (Sandbox Code Playgroud)
PS C:\> CheckLastChar("Lab 1-")
It's NOT an int!

PS C:\> CheckLastChar("Lab 1-000")
It's an int!
Run Code Online (Sandbox Code Playgroud)

虽然,我不得不说mjolinor的-as [int] -is [int]解决方案要好得多.