我们的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怎么啦?我花了几个小时在Google上搜索,但是我找不到具体的答案。
发布于 2013-01-15 23:47:09
我认为你误解了如何访问你的二维数组的元素。当你说:
$spelbordd[$i, $r]您是说,在$i和$r中给出元素,后者返回2个数组(二维)。若要访问行$i和列$r上的元素,请使用:
$spelbordd[$i][$r]发布于 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),那么元素访问语法将是正确的。
https://stackoverflow.com/questions/14348639
复制相似问题