我有一個簡單的腳本,它創建二維字符陣列,并呼叫函式,該函式應該用給定的字符填充該陣列。
[int]$size = Read-Host "Please, enter the board size"
$playerBoard = New-Object 'char[,]' $size,$size
Fill-Boad-With-Symbol($playerBoard,'*',$size)
這是功能
function Fill-Boad-With-Symbol([char[,]]$board, [char]$symbol,[int]$boardSize){
for ($i=0; $i -lt $boardSize; $i ) {
for ($j=0; $j -lt $boardSize; $j ) {
$board[$i,$j] = $symbol
}
}
}
但是在執行此代碼時,我收到以下錯誤:
Cannot process argument transformation on parameter 'board'. Cannot convert the "System.Char[,]" value of type "System.Char[,]" to type "System.Char"
...
Fill-Boad-With-Symbol($playerBoard,'*',$size)
我懇請解釋一下,我做錯了什么?
uj5u.com熱心網友回復:
在我的評論中,在 PowerShell 中,引數要么是位置引數,要么是命名引數,您的第一個錯誤是您將引數傳遞給函式的方式。通過做這個:
Fill-Board-Symbol($playerBoard,'*',$size)
PowerShell 會將它解釋為好像您正在傳遞一個object[](object array),其中第一個元素array[0]將是$playerBoard,第二個元素將是 a*和第三個元素, anint到您的函式的第一個引數,該引數-Board 是型別約束 to char[,]。
然后 PowerShell 將嘗試從object[]to 進行型別轉換char[,],它會失敗并出現您看到的例外。
例子:
鑒于這些變數:
$playerBoard = New-Object 'char[,]' 2,2
$symbol = '*'
$size = 2
將它們組合在一起,(...)我們可以檢查它的型別:
PS /> ($playerBoard, $symbol, $size).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
如果我們嘗試將其轉換為[char[,]]:
PS /> [char[,]]($playerBoard, $symbol, $size)
InvalidArgument:無法將“System.Char[,]”型別的“System.Char[,]”值轉換為“System.Char”型別。
嘗試這樣做:
[int]$size = Read-Host "Please, enter the board size"
$playerBoard = New-Object 'char[,]' $size,$size
function Fill-Board-With-Symbol {
param(
[char[,]]$board,
[char]$symbol,
[int]$boardSize
)
for ($i=0; $i -lt $boardSize; $i ) {
for ($j=0; $j -lt $boardSize; $j ) {
$board[$i,$j] = $symbol
}
}
$board # => This is your output
}
$newBoard = Fill-Board-With-Symbol -Board $playerBoard -Symbol '*' -BoardSize $size
$newBoard
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/379955.html
