2

到目前为止,我一直能够从该网站上的现有帖子中获得答案,但今天我有一个问题似乎之前没有人问过。

它关于以下代码:

class Board<T>
{
    private T[,] board;

    public T[,] BoardArray
    {
        get { return (T[,])board.Clone(); }
    }

    public T this[int y, int x]
    {
        get { return board[y, x]; }
        set { board[y, x] = value; }
    }

    public Board()
    {
        board = new T[8, 8];
    }

    public void AssignToBoard()
    {
        board[1, 2] = 3;
        this[1, 2] = 3;
    }
}

问题是方法中的两行代码都会产生相同的编译时错误。我知道为什么会抛出错误,但我不知道一个干净的解决方法。这是错误:

Error   1   Cannot implicitly convert type 'int' to 'T' C:\Users\Peter\Desktop\Dropbox\ReversieAI\ReversieAI\ReversieAI\Map.cs  31  18  ReversieAI

我能够编译我的代码的唯一方法是将这些行更改为:

board[1, 2] = (T)(object)3;
this[1, 2] = (T)(object)3;

尽管它有效,但它仍然是一个肮脏的解决方案。你们中的任何人都认识到这个问题并且可以帮助我/分享任何想法吗?

在此先感谢,彼得

编辑:我通过更改架构中删除类的通用部分的某些内容找到了解决方案。感谢您的所有反馈。对此,我真的非常感激。

4

2 回答 2

3

问题似乎是在 AssignToBoard 方法中,您假设这Tint通过将整数放入包含Ts 的数组中。

我通常会期待类似的东西:

public void AssignToBoard(T value)
{
    board[1, 2] = value;
    this[1, 2] = value;
}

在这种情况下,您将传递一个T正在分配的正确类型 ( ) 的值。

然后你可以在其他地方做一些事情,比如:

var myboard = new Board<int>();
myboard.AssignToBoard(3);

作为附加说明(T)(object)3,如果 T 类似于字符串并且无法在运行时转换,则使用的解决方案可能会在运行时失败。你真的只是将任何问题从编译时推到运行时......

于 2012-07-03T16:28:15.593 回答
1

AssignToBoard 不是通用的,但 board 是通用的。

你的意思是把它作为一个测试功能移出董事会。如果是这样,您将创建一个 Board 并使用它,一切都会正常工作。

要进行测试,您可以使用 AssignToBoard 之类的

public void AssignToBoard()
{
    Board<int> testBoard = new Board<int>();
    testBoard[1, 2] = 3;
}
于 2012-07-03T16:27:53.447 回答