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,而不是慢速索引器,这样就不会有问题了。我放索引器只是为了方便。