【问题标题】:Cannot convert the "System.Char[,]" value of type "System.Char[,]" to type "System.Char"无法将“System.Char[,]”类型的“System.Char[,]”值转换为“System.Char”类型
【发布时间】:2022-01-16 08:59:00
【问题描述】:

我有一个简单的脚本,它创建二维字符数组,并调用函数,该函数应该用给定的字符填充该数组。

[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)

请解释一下,我做错了什么?

【问题讨论】:

  • $playerBoard 通过Fill-Boad-With-Symbol 后,您的预期输出是什么?
  • @SantiagoSquarzon 我希望 $playerBoard 将填充 '*'
  • 您的错误是因为您调用函数的方式,在 PS 中,参数是命名的或位置的,每个参数由空格分隔 => Fill-Boad-With-Symbol $playerBoard '*' $size。我还认为您对 New-Object 'char[,]' $size,$size 在控制台中的外观有错误的期望。
  • 这将是一个二维数组,但它看起来不像您期望的那样。它将是控制台上的一条垂直线。
  • @SantiagoSquarzon,我知道,我有单独的函数将其打印为二维数组

标签: function powershell arguments


【解决方案1】:

在我的评论中,在 PowerShell 中,参数要么是位置的,要么是命名的,您的第一个错误是您将参数传递给函数的方式。通过这样做:

Fill-Board-Symbol($playerBoard,'*',$size)

PowerShell 会将其解释为您传递了一个object[](对象array),其中第一个元素array[0] 将是$playerBoard,第二个元素将是*,第三个元素是@987654327 @ 到你的函数 -Board 的第一个参数,这是对char[,] 的类型约束。

然后,PowerShell 将尝试从 object[]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

【讨论】:

    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    相关资源
    最近更新 更多