【问题标题】:C#, Throws error what trying to get value from two dimensional array and uses it in TryParseC#,抛出错误试图从二维数组中获取值并在 TryParse 中使用它
【发布时间】:2021-11-26 13:06:21
【问题描述】:
private static char[,] boardValues = {
    {'1', '2', '3'},
    {'4', '5', '6'},
    {'7', '8', '9'}
};

public static bool SetPlayerLocation(int[] location, char character)
{
    // check if slot is taken
    if (byte.TryParse(boardValues[location[0],location[1]], out _))
    {
        boardValues[location[0], location[1]] = character;
        return true;
    }
    else
    {
        return false;
    }
}

这一直抛出错误,无法在if 语句的行上从“char”转换为“System.ReadOnlySpan<char>”。

【问题讨论】:

  • 有no overload of byte.TryParse which takes a char。你可能需要先把它变成一个字符串:byte.TryParse(boardValues[...].ToString(), out _)
  • 但是,只检查 char 是否在 0 到 9 之间会更好吗? if (boardValues[...] is >='0' and <='9')
  • @CaiusJard 是的,尽管从中减去“0”更容易
  • 哈,是的,我忘记了这些事情。虽然只有一个按键:D
  • 我查看了 TryParse 并假设您正在尝试转换,例如一个 char '0' 到一个数字 0,所以我指出你可以通过减去 0x30('0' 的十六进制代码,我发现它比十进制 48 更容易记住,因为 0x30 和 0 都是以 0 结尾,“7”的十六进制代码是 0x37 等)。然后安东尼指出,减去'0'会更容易......

标签: c# arrays multidimensional-array


【解决方案1】:

您从未说过“已使用”是什么意思,但它看起来可能是“'0' 和 '9' 之间的一个字符” - 也许“未使用”的插槽有一个空格 ' '或 'x' 在里面.. 或类似的..

因此,您拥有的这段代码本质上似乎是为了检查数字的存在,为此我建议:

private static char[,] boardValues = {
    {'1', '2', '3'},
    {'4', '5', '6'},
    {'7', '8', '9'}
};

public static bool SetPlayerLocation(int[] location, char character)
{
    var slotTaken = Char.IsDigit(boardValues[location[0],location[1]]);

    if (slotTaken)
        boardValues[location[0], location[1]] = character;
    
    return slotTaken;
}

如果我们用一个合理的变量名让代码更加自我记录,我们可以取消注释..

..这让我怀疑逻辑是否真的正确 - 如果占用了一个插槽,那么您可以替换它吗?

应该将变量称为slotFree 吗? if 应该是 if(!slotTaken),还是玩家只能占用已占用的位置真的正确吗?只有你知道这一点,但这是一个很好的介绍如何创建自我记录、可读的代码可以帮助通知其他人阅读它(当你离开时接管你工作的人:D)或发现错误

【讨论】:

  • 只是检查该位置的字符是数字(例如“0”、“1”等)还是值“X”或“O”。 Char.isDigit() 方法解决了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2021-08-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多