2013-01-15 23 views
0

我們的PowerShell腳本被給了一個錯誤:PowerShell的給op_Addition誤差爲()語句

Method invocation failed because [System.Object[]] doesn't contain a method named 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 

有什麼不對?我花了幾個小時在谷歌搜索,但我找不到具體的答案。

回答

0

我想你是誤解如何訪問你的二維數組的元素。當你說:

$spelbordd[$i, $r] 

你在說,給我$ i和$ r的元素,它返回2個數組(第二維)。要在行$ i和列$ R使用訪問元素:

$spelbordd[$i][$r] 
+0

它給出了這樣的錯誤:「索引操作失敗,數組索引評估爲null」 – user1981919

+0

@ user1981919你有一個未定義的$ k:'$ spelbordd [$ r + 3,$ k]'這很可能什麼評估爲null。 – zdan

-1

雖然最初的答案,「解決」的有機磷農藥的問題,他們並沒有回答這個問題。有沒有爲什麼錯誤信息被

方法調用失敗解釋,因爲[System.Object的[]不包含名爲op_Addition

方法答案就在PowerShell中的有些模糊運算符優先級(https://msdn.microsoft.com/en-us/powershell/reference/5.0/microsoft.powershell.core/about/about_operator_precedence )。特別是,','(數組元素分隔符)比'+'(加法)具有更高的優先級。因此,雖然可以假定數組訪問表達

$ spelbordd [$ + 1,$ R]

返回數組$ spelbordd [$ I + 1]和$ spelbordd [陣列$ r](切片的連接),實際上數組元素表達式[$ i + 1,$ r]解析爲[$ i +(1,$ r)],因此試圖將$ i添加到數組[System。 Object []](1,$ r)通過使用它的op_Addition方法(在非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
因爲它解析爲
( '{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#使用第一格式參數兩次
因爲它解析爲
( '{0} {0}' -f 1 )+(2,2)
,並且由於左操作數的類型決定了如何應用運算符,結果爲
('{0} {0}'-f 1)+ [System.String]( 2,2)#[System.String] $是的someArray($ -join的someArray'「)

而且-join發言,優先進入

一元-join

二進制-join

所以

-join 1,2-是(-join 1),2 =( '1',2)#([字符串],[ INT32])
-join(1,2)= '12'
1,2- -join '' 是(1,2)-join ''= '12'

順便說一句,只要在技術上是精確,OP使用的是數組的數組,而不是二維數組,這就是元素訪問語法錯誤的原因。如果OP實際上創建了一個二維數組(如$ spelbordd = new-object'Boolean [,]'10,10),那麼元素訪問語法將是正確的。