带有前缀逗号的索引0的$ Array.IndexOf错误

M J*_*ter 2 powershell powershell-3.0

我试图将变量的内容添加到数组中.不知道数组是否已初始化,我使用前面的数据插入逗号以强制它作为数组进行求值.似乎在执行此操作时,使用前面的逗号到您的实际项目,该indexof方法不会为数组中的第一个项目提供正确的索引.

在下面的代码示例中,$a展示了问题,同时$b工作正常; 唯一的区别是初始化时前面的逗号$a.

这是一个错误,还是我错过了什么?

PS C:\code> $a = (,4,5,6)
PS C:\code> $b = (4,5,6)
PS C:\code> $a
4
5
6
PS C:\code> $a.indexof(4)
-1
PS C:\code> $a.indexof(5)
1
PS C:\code> $a.indexof(6)
2
PS C:\code> $b
4
5
6
PS C:\code> $b.indexof(4)
0
PS C:\code> $b.indexof(5)
1
PS C:\code> $b.indexof(6)
2
Run Code Online (Sandbox Code Playgroud)

因为有问题,我只是用我的变量作为前缀[array]并删除了前缀逗号,一切似乎都很好.我只是好奇发生了什么事.

Mat*_*att 5

这里发生的一些事情正在导致误导性的结果.只知道这种行为是预期的,

在第一个数组中,$a您创建了3个元素.首先是一元算子.你实际做了什么是创建一个三元素数组,其中第一个元素本身是一个元素的整数数组.PowerShell帮你一个忙,并展开数组,这就是为什么输出$a$b在控制台中显示相同的原因.

PS M:\Scripts> $a = (,4,5,6)

PS M:\Scripts> $a[0].GetType().Fullname
System.Object[]

PS M:\Scripts> $a[1].GetType().Fullname
System.Int32
Run Code Online (Sandbox Code Playgroud)

那么该.IndexOf()方法没有找到元素4的原因是因为它没有深入研究嵌套数组.

搜索指定的对象并在一维数组中返回其第一次出现的索引.

根据定义,它似乎不会搜索嵌套数组.

如果您需要考虑到这一点,那么您可以使用-is运算符或只检查类型.

PS M:\Scripts> $a | %{$_ -is [array]}
True
False
False

PS M:\Scripts> $a | %{$_.GetType().Fullname}
System.Object[]
System.Int32
System.Int32
Run Code Online (Sandbox Code Playgroud)

重点是我在这里没有看到错误.只是PowerShell非常容易被误导.