C# 泛型类中的数组和索引器

C# 泛型类中的数组和索引器,c#,generics,indexer,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 bo

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

下面是一段代码:

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;
    }
}
我能够编译代码的唯一方法是将行更改为:

board[1, 2] = (T)(object)3;
this[1, 2] = (T)(object)3;
尽管它有效,但它仍然是一个肮脏的解决方案。你们中有谁认识到这个问题并能帮助我/分享一些想法吗

提前感谢,, 彼得


编辑:我已经找到了一个解决方案,在我的体系结构中修改了一些内容,删除了类的通用部分。谢谢你的反馈。我真的很感激。AssignToBoard不是通用的,但board是通用的

你的意思是把它从板上移出作为测试功能吗。如果是这样的话,你将创建一个板并使用它,一切都会很好

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

public void AssignToBoard()
{
    Board<int> testBoard = new Board<int>();
    testBoard[1, 2] = 3;
}
public void AssignToBoard()
{
板测试板=新板();
测试板[1,2]=3;
}

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

你的意思是把它从板上移出作为测试功能吗。如果是这样的话,你将创建一个板并使用它,一切都会很好

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

public void AssignToBoard()
{
    Board<int> testBoard = new Board<int>();
    testBoard[1, 2] = 3;
}
public void AssignToBoard()
{
板测试板=新板();
测试板[1,2]=3;
}

问题似乎在于,在AssignToBoard方法中,通过将整数放入包含
T
s的数组,您假设
T
int

我通常会想到这样的事情:

public void AssignToBoard(T value)
{
    board[1, 2] = value;
    this[1, 2] = value;
}
在这种情况下,您将传入一个正确类型的值(
T

然后,您可以在其他地方执行以下操作:

var myboard = new Board<int>();
myboard.AssignToBoard(3);
var myboard=newboard();
我的董事会。分配董事会(3);

另外需要注意的是,如果T类似于字符串,并且不能在运行时转换,那么使用
(T)(object)3
的解决方案在运行时可能会失败。您实际上只是将任何问题从编译时推到运行时…

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

我通常会想到这样的事情:

public void AssignToBoard(T value)
{
    board[1, 2] = value;
    this[1, 2] = value;
}
在这种情况下,您将传入一个正确类型的值(
T

然后,您可以在其他地方执行以下操作:

var myboard = new Board<int>();
myboard.AssignToBoard(3);
var myboard=newboard();
我的董事会。分配董事会(3);

另外需要注意的是,如果T类似于字符串,并且不能在运行时转换,那么使用
(T)(object)3
的解决方案在运行时可能会失败。你真的只是把任何问题从编译时推到运行时…

如果你知道,你的电路板将是int[,]类型,而不是为什么你要将它设为泛型?旁注:你的BoardArray属性具有属性所不具备的性能特征-复制大量数据。考虑改变一个函数来避免“我称之为简单的属性,现在我的程序爬行”的问题。“AlexeiLevenkov,我理解你的观点,但是如果我不返回一个副本,那么返回的数组的任何改变也会反映在字段本身,这是我想要避免的。这是纯粹的推荐……但是要注意像
g.BoardArray[3,4]*2-g.BoardArray[3,2]+g.BoardArray[3,7]
这样的代码,在这些代码中,似乎很快的属性会多次复制数据。@Alexei您能否澄清在您的示例中何时复制数据?我在循环中使用实际的数组via BoardProperty,而不是慢速索引器,这样就不会有问题了。我放入索引器只是为了方便。如果您知道,您的电路板将是int[,]类型,那么为什么要将其设置为泛型类型?旁注:您的BoardArray属性具有属性所不具备的性能特征-复制大数据块。考虑改变一个函数来避免“我称之为简单的属性,现在我的程序爬行”的问题。“AlexeiLevenkov,我理解你的观点,但是如果我不返回一个副本,那么返回的数组的任何改变也会反映在字段本身,这是我想要避免的。这是纯粹的推荐……但是要注意像
g.BoardArray[3,4]*2-g.BoardArray[3,2]+g.BoardArray[3,7]
这样的代码,在这些代码中,似乎很快的属性会多次复制数据。@Alexei您能否澄清在您的示例中何时复制数据?我在循环中使用实际的数组via BoardProperty,而不是慢速索引器,这样就不会有问题了。我放索引器只是为了方便。