Arrays 为什么表达式需要放在数组的括号中

Arrays 为什么表达式需要放在数组的括号中,arrays,powershell,Arrays,Powershell,在files1数组中创建第二个数组时,数学表达式必须放在括号中。运算符的层次结构是否不适用于此处 PS C:\src\powershell> Get-Content .\fr-btest2.ps1 $files1 = @( , @(4, 1024) , @(2*3, 4*5) ) $files1 $files1.GetType() $files1.Length $files1.Count '============' $files2 = @( , @(4, 1024) , @((2*

在files1数组中创建第二个数组时,数学表达式必须放在括号中。运算符的层次结构是否不适用于此处

PS C:\src\powershell> Get-Content .\fr-btest2.ps1
$files1 = @(
, @(4, 1024)
, @(2*3, 4*5)
)

$files1
$files1.GetType()
$files1.Length
$files1.Count

'============'

$files2 = @(
, @(4, 1024)
, @((2*3), (4*5))
)

$files2
$files2.GetType()
$files2.Length
$files2.Count
PS C:\src\powershell> .\fr-btest2.ps1
Method invocation failed because [System.Object[]] does not contain a method named 'op_Multiply'.
At C:\src\powershell\fr-btest2.ps1:3 char:5
+ , @(2*3, 4*5)
+     ~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Multiply:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

4
1024

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
2
2
============
4
1024
6
20
True     True     Object[]                                 System.Array
2
2
(数组构造运算符)的优先级高于
*
-请参阅

注意:以下代码段不使用数组子表达式运算符
@(…)
,因为不需要指定数组文字-数组构造运算符
就足够了

所以,

2*3, 4*5
解析为:

2 * (3, 4) * 5
而且PowerShell不知道如何在
*
的RHS上使用阵列

需要使用括号表示明确的优先级:
(2*3)、(4*5)
生成所需的数组,
6,20


顺便说一句:PowerShell支持
*
的LHS上的数组,尽管不是数字意义上的数组:使用数组作为LHS(平直地)复制数组的频率与(标量、数字)RHS上指定的频率相同-类似于使用
*
复制LHS上的字符串的方式:

> (2,3) * 2  # equivalent of: 2, 3, 2, 3
2
3
2
3

优先规则的可能动机 虽然我真的不知道赋予
*
等运算符更高优先级的设计原理,但我想到了一个可能的原因:

一些PowerShell操作符(尤其是
-replace
-split
)将数组作为其RHS

如果
具有更高的优先级,则可以使用以下表达式,而无需在RHS元素周围使用括号:

> 'A barl and his money are soon parted.' -replace 'bar', 'foo'
A fool and his money are soon parted.

如果我自己在现实世界中的经验值得借鉴,那么遇到这个优先问题时,像这个问题这样意想不到的方式是很少见的。

这是一个好问题,但我建议你把它简化为一个MCVE:
@(2*3,4*5)
甚至
2*3,4*5
足以产生症状,并且
(2*3),<4*5)
足以解决问题。我将选择此作为正确答案,因为它是正确的。这并不是因为我认为这种语言的语法是好的。在这个时间点上的想法。当然,还有一些事情我还不明白,让这成为一个好主意。