首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell在for()语句中给出op_Addition错误

Powershell在for()语句中给出op_Addition错误
EN

Stack Overflow用户
提问于 2013-01-15 23:10:11
回答 2查看 4.5K关注 0票数 0

我们的PowerShell脚本出现了一个错误:

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

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

这是我的代码中的一部分,用于检查获胜者:

代码语言:javascript
复制
[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

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

EN

回答 2

Stack Overflow用户

发布于 2013-01-15 23:47:09

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

代码语言:javascript
复制
$spelbordd[$i, $r]

您是说,在$i和$r中给出元素,后者返回2个数组(二维)。若要访问行$i和列$r上的元素,请使用:

代码语言:javascript
复制
$spelbordd[$i][$r]
票数 0
EN

Stack Overflow用户

发布于 2017-02-22 17:26:53

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

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

答案在于Powershell (precedence)中有些模糊的操作符优先级。特别是,“,”(数组元素分隔符)比“+”(加法)具有更高的优先级。因此,虽然可以假定数组访问表达式

$spelbordd$i+1,$r

返回两个数组( $spelbordd$i+1和$spelbordd$r )的数组,实际上数组元素表达式$i+1、$r解析为$i+(1,$r),因此尝试使用其op_Addition方法将$i添加到数组System.Object[] (当您在非ValueType对象中使用'+‘运算符时会发生什么)。由于[System.Object[]]没有op_Addition方法,所以列出的错误结果。

在这种情况下,意外的优先级问题只是因为语法错误(访问二维数组的方法不正确)才暴露出来的。但是,微妙的运算符优先级可以在更常见的表达式中显示出来。除了那些用本身是表达式的元素创建数组的表达式之外,最有可能的陷阱是格式运算符'-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 (operators)中,它具有与'+’操作符的良好定义行为。

'{0} {0}‘-f 1+2,2 #使用第一个格式参数两次

1 12 2

因为它被解析为

({0} {0}‘-f 1)+(2,2)

而且,由于左操作数的类型决定了运算符的应用方式,结果是

('{0} {0}‘-f 1)+System.String # System.String $somearray is ($somearray -join ')

说到-join,优先顺序是

一元-join

二进制-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 =新对象'Boolean,‘10,10),那么元素访问语法将是正确的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14348639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档