0

我们的 PowerShell 脚本报错:

方法调用失败,因为 [System.Object[]] 不包含名为 op_Addition' 的方法

我正在编写一个“四合一”游戏,所以它必须检查游戏是否包含四合一。

这是我检查获胜者的一段代码:

[script]
function winner{

        $spelbordd = @()
        $spelbordd += ,@($A10,$B10,$C10,$D10,$E10,$F10,$G10,$H10,$I10,$J10)  
        $spelbordd += ,@($A9,$B9,$C9,$D9,$E9,$F9,$G9,$H9,$I9,$J9) 
        $spelbordd += ,@($A8,$B8,$C8,$D8,$E8,$F8,$G8,$H8,$I8,$J8) 
        $spelbordd += ,@($A7,$B7,$C7,$D7,$E7,$F7,$G7,$H7,$I7,$J7) 
        $spelbordd += ,@($A6,$B6,$C6,$D6,$E6,$F6,$G6,$H6,$I6,$J6) 
        $spelbordd += ,@($A5,$B5,$C5,$D5,$E5,$F5,$G5,$H5,$I5,$J5) 
        $spelbordd += ,@($A4,$B4,$C4,$D4,$E4,$F4,$G4,$H4,$I4,$J4) 
        $spelbordd += ,@($A3,$B3,$C3,$D3,$E3,$F3,$G3,$H3,$I3,$J3) 
        $spelbordd += ,@($A2,$B2,$C2,$D2,$E2,$F2,$G2,$H2,$I2,$J2) 
        $spelbordd += ,@($A1,$B1,$C1,$D1,$E1,$F1,$G1,$H1,$I1,$J1)

        for([int]$i=0; $i -lt 9; $i++){
    if($i -le 5){
        for([int]$r=0; $r -lt 9; $r++){
            if($spelbordd[$i, $r] -and $spelbordd[$i+1, $r] -and $spelbordd[$i+2,$r] -and $spelbordd[$i+3]){
                $winner = $player
             }
         }
    }
    for([int]$r=0; $r -le 5; $r++){
        for([int]$j=0; $j -lt 9; $j++){
            if($spelbordd[$r,$j] -and $spelbordd[$r+1,$j] -and $spelbordd[$r+2,$j] -and $spelbordd[$r+3,$k]){
                $winner = $player
             }
         }
     }
}

$winner

怎么了?我在谷歌上花了几个小时搜索,但我找不到具体的答案。

4

2 回答 2

0

我认为您误解了如何访问二维数组的元素。当你说:

$spelbordd[$i, $r]

你是说,给我 $i 和 $r 的元素,它返回 2 个数组(第 2 维)。要访问 $i 行和 $r 列的元素,请使用:

$spelbordd[$i][$r]
于 2013-01-15T23:47:09.873 回答
-1

虽然最初的答案“解决”了 OP 问题,但他们没有回答这个问题。没有解释为什么错误消息是

方法调用失败,因为 [System.Object[]] 不包含名为 op_Addition 的方法

答案在于 Powershell 中有点模糊的运算符优先级 ( https://msdn.microsoft.com/en-us/powershell/reference/5.0/microsoft.powershell.core/about/about_operator_precedence )。特别是,“,”(数组元素分隔符)比“+”(加法)具有更高的优先级。因此,虽然可以假定数组访问表达式

$spelbordd[$i+1, $r]

返回两个数组 $spelbordd[$i+1] 和 $spelbordd[$r] 的数组(切片的串联),实际上数组元素表达式 [$i+1,$r] 解析为 [$i+( 1,$r)] 等尝试通过使用其 op_Addition 方法将 $i 添加到数组 [System.Object[]] (1,$r) (当您将 '+' 运算符与非值类型对象)。由于 [System.Object[]] 没有 op_Addition 方法,因此列出的错误结果。

PS 在这种情况下,意外的优先级问题只是由于语法错误(访问二维数组的方法不正确)而暴露出来的。但是,微妙的运算符优先级可以体现在更常见的表达式中。除了那些使用本身就是表达式的元素创建数组的表达式之外,最可能的陷阱是格式运算符“-f”,它的优先级介于“,”和算术运算符之间。因此,以下示例产生了一些意想不到的结果:

'{0} {1}' -f 1+2, 2
错误,格式化参数不足,
因为它解析为
('{0} {1}' -f 1)+(2,2)
并且在尝试之前格式化失败将“+”应用于 (2,2)。

'{0} {1}' -f 1,2+2
1 22
因为它解析为
('{0} {1}' -f (1,2))+2
和 ('{0} { 1}' -f (1,2)) 是一个 [System.String],虽然它也没有 op_Addition,但在 Powershell 中使用“+”运算符具有明确定义的行为(https://msdn.microsoft。 com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_arithmetic_operators)。

'{0} {0}' -f 1+2,2 #使用第一个格式参数两次
1 12 2
因为它被解析为
('{0} {0}' -f 1)+(2,2)
并且,因为左操作数的类型决定了如何应用运算符,结果是
('{0} {0}' -f 1)+[System.String] (2,2) # [System.String] $somearray is ( $somearray -加入'')

说到-join,优先级是

一元连接
,
二元连接

所以

-join 1,2 是 (-join 1),2 = ('1',2) # ([String],[Int32])
-join (1,2) = '12'
1,2 -join '' 是(1,2) -join '' = '12'

顺便说一句,从技术上讲,OP 使用的是数组数组,而不是二维数组,这就是元素访问语法错误的原因。如果 OP 实际上创建了一个二维数组(如 $spelbordd = new-object 'Boolean[,]' 10,10),那么元素访问语法将是正确的。

于 2017-02-22T17:26:53.467 回答