到目前为止,我一直能够从本网站上的现有帖子中得到答案,但今天我有一个问题,没有人问过它。
关于以下代码:
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;
虽然它有效,但它仍然是一个肮脏的解决方案。你们中的任何人都认识到这个问题,可以帮助我/分享任何想法吗?
提前致谢, 彼得
编辑:我通过改变我的架构中删除类的通用部分的东西找到了解决方案。感谢您的所有反馈。我真的很感激。
答案 0 :(得分:3)
问题似乎是在AssignToBoard方法中,假设T
是int
,方法是将整数放入包含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。如果是这样,你将创建一个董事会并使用它,一切都会正常。
要进行测试,您可以使用像
这样的AssignToBoardpublic void AssignToBoard()
{
Board<int> testBoard = new Board<int>();
testBoard[1, 2] = 3;
}