Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将int 2d数组`int[,]`转换为enum 2d数组`enum[,]`?_C# - Fatal编程技术网

C# 如何将int 2d数组`int[,]`转换为enum 2d数组`enum[,]`?

C# 如何将int 2d数组`int[,]`转换为enum 2d数组`enum[,]`?,c#,C#,我有一个网格和一个矩阵的瓷砖 enum Tile { Nothing = 0, Forest = 1, River = 2, OB = 3 } class Grid { public const int X = 6; public const int Y = 6; private Tile[,] Board { get; set; } public Grid() { Board = new Tile[X

我有一个网格和一个矩阵的瓷砖

enum Tile
{ 
    Nothing = 0,
    Forest = 1,
    River = 2,
    OB = 3
}

class Grid
{
    public const int X = 6;
    public const int Y = 6;
    private Tile[,] Board { get; set; } 
    public Grid()
    {
        Board = new Tile[X, Y];
    }
}
我想有一个可以接受
int[,]板的Ctor

不符合以下条件的边缘情况:

  • 不同的尺寸。可以使用
    .GetLength(0)
    进行检查,以匹配常量int X。扔
  • 未知的值
    (平铺)12
    ,设置为默认值int=0
所以我有

public Grid(int[,] board)
{
    if (board.GetLength(0) != Y || board.GetLength(1) != X) { 
        throw new ArgumentException();            
    }

    Board = new Tile[Y, X];
    for (int i = 0; i < Y; i++)
    for (int j = 0; j < X; j++) {
        var enumValue = (Enum.IsDefined(typeof(Tile),board[i, j]))? (Tile)board[i, j]: default(Tile) ;
        Board[i, j] = enumValue;
    }
}
公共电网(int[,]板) { 如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){ 抛出新ArgumentException(); } 板=新瓷砖[Y,X]; for(int i=0;i 是否有一种直接向前的方法可以将int 2d数组
int[,]
强制转换为enum 2d数组
enum[,]


我尝试各种演员组合,如,()。没有成功。

由于.NET最初是用来处理数组协方差的,因此实际上可以直接将
派生[]
数组转换为
基[]
数组

但是,在
enum[]
的情况下,您始终可以安全地强制转换到
int[]
这是因为
enum
默认情况下是
int
。(如果您有
enum:byte
可以强制转换为
byte[]

但C#不会让你轻易做到。您需要先强制转换到
对象

公共电网(int[,]板) { 如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){ 抛出新ArgumentException(); } 板=(瓷砖[,])(对象)板; } 这有点不安全,因为它只存储传入的数组。如果您需要副本,只需调用
Clone

公共电网(int[,]板) { 如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){ 抛出新ArgumentException(); } Board=(Tile[,])Board.Clone(); }
由于.NET最初是用来处理数组协方差的,因此实际上可以直接将
派生[]
数组转换为
基[]
数组

但是,在
enum[]
的情况下,您始终可以安全地强制转换到
int[]
这是因为
enum
默认情况下是
int
。(如果您有
enum:byte
可以强制转换为
byte[]

但C#不会让你轻易做到。您需要先强制转换到
对象

公共电网(int[,]板) { 如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){ 抛出新ArgumentException(); } 板=(瓷砖[,])(对象)板; } 这有点不安全,因为它只存储传入的数组。如果您需要副本,只需调用
Clone

公共电网(int[,]板) { 如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){ 抛出新ArgumentException(); } Board=(Tile[,])Board.Clone(); }