泛型类中的数组和索引器

时间:2012-07-03 16:24:58

标签: c# generics indexer

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

关于以下代码:

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;

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

提前致谢, 彼得

编辑:我通过改变我的架构中删除类的通用部分的东西找到了解决方案。感谢您的所有反馈。我真的很感激。

2 个答案:

答案 0 :(得分:3)

问题似乎是在AssignToBoard方法中,假设Tint,方法是将整数放入包含T s的数组中。

我通常会期待类似的事情:

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

在此处传递正在分配的正确类型(T)的值。

然后你可以在其他地方做点什么:

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

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

答案 1 :(得分:1)

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

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

要进行测试,您可以使用像

这样的AssignToBoard
public void AssignToBoard()
{
    Board<int> testBoard = new Board<int>();
    testBoard[1, 2] = 3;
}