3

请考虑这个愚蠢的例子:

if (1..3) { "true" }

以上产生输出true

我的问题: if 语句如何处理这样的情况,其中条件输出多个值?“真”输出是“3”(最后一种情况)的结果吗?还是其他一些逻辑在起作用?谢谢。

4

3 回答 3

4

观察到的行为在此博客文章中(在某种程度上)进行了解释。基本上,如果一个表达式的计算结果为 0,则它被解释为假,否则为真。例子:

0      => False
1      => True
"0"    => True (because it's a string of length 1)
""     => False (because it's a string of length 0)
@()    => False
@(0)   => False (this one's a little surprising)
@(0,1) => True
@("0") => True
于 2013-06-13T11:03:29.253 回答
2

正如预期的那样,上面的输出为真。

为什么你期望它输出“真”?

if 语句如何处理条件输出多个值的这种情况?

条件不“输出”任何值。它总是评估为“真”或“假”。剩下的问题是,为什么它评估为真(或假)。

编码

   if (1..3) { "true" }

等于

   if (@(1,2,3)) { "true" }

等于

   $array = @(1,2,3)
   if ($array) { "true" }

表现为

   if ($array.Length -gt 0) { "true" }

因此,不会测试单个元素,而是测试数组是否包含任何元素。

例如,以下内容不会打印“true”:

   if (@()) { "true" }

更新如果数组只包含一个值,它看起来(我找不到任何规范文档),就好像数组被视为使用里面的一个元素的标量值。

所以

   if (@(0)) 
   if (@(0.0)) 
   if (@(1)) 
   if (@(-1)) 
   if (,$null)) 
   if (,"false")) 

被视为

   if (0)  --> false
   if (0.0)  --> false
   if (1)  --> true
   if (-1)  --> true
   if ($null)  --> false
   if ("false") --> true
于 2013-06-13T10:21:25.127 回答
1

1..3 生成一个包含 3 个项目的数组

PS> (1..3).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> (1..3).Length
3

如果数组中至少有一项,则 if 认为它是真的

PS> if (@()) { "true" } else { "false" }
false

PS> if (@(1)) { "true" } else { "false" }
true

PS> if (@(1,2)) { "true" } else { "false" }
true
于 2013-06-13T10:19:57.383 回答