我们的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上搜索,但我找不到具体的答案。
答案 0 :(得分:0)
我认为你误解了如何访问二维数组的元素。当你说:
$spelbordd[$i, $r]
你要说的是,给我$ i和$ r的元素,返回2个数组(第二维)。要访问行$ i和列$ r的元素,请使用:
$spelbordd[$i][$r]
答案 1 :(得分:-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)(当您使用'+'运算符时会发生什么非ValueType对象)。由于[System.Object []]没有op_Addition方法,因此列出了错误结果。
P.S。在这种情况下,意外的优先级问题仅由于语法错误(访问二维数组的方法不正确)而暴露。但是,微妙的运算符优先级可以表现为更常见的表达式。除了那些创建具有本身表达式元素的数组的表达式之外,最可能的陷阱是格式运算符'-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,优先顺序
一元-join
,
二进制-join
所以
-join 1,2是(-join 1),2 =('1',2)#([String],[Int32])
-join(1,2)='12'
1,2-join''是(1,2)-join''='12'