2

我正在使用 C#,我必须在屏幕上操作一个对象。我设置了一个结构来保存坐标,然后我设置了一个枚举来限制可以移动的方向的数量。

private enum Direction
{
    UpperLeft = new Coord(-1, -1), 
    UpperCenter = new Coord(0, -1), 
    UpperRight = new Coord(1, -1),
    Left = new Coord(-1, 0), 
    Right = new Coord(1, 0),
    LowerLeft = new Coord(-1, 1), 
    LowerCenter = new Coord(0, 1),
    LowerRight = new Coord(1, 1)
};

private struct Coord
{
    public int row { get; private set; }
    public int col { get; private set; }
    public Coord(int r, int c) : this()
    {
        row = r;
        col = c;
    }

    public static Coord operator +(Coord a, Coord b)
    {
        return new Coord(a.row + b.row, a.col + b.col);
    }
}

基本上我的目标是让屏幕上的对象根据分配的枚举移动。

所以我想假设像这样使用它或其他东西:

public class ThingThatMovesToTheLeft
{
    Direction dir = Direction.Left;
    Coord pos = new Coord(0,0);
    public void Move()
    {
        this.pos = this.dir + this.pos;
    }
}

本质上我的问题是如何将我的枚举类型转换回我的结构,以便我可以以这种方式使用它?我似乎无法将其转换回结构。(此外,VisualStudio 让我将枚举分配给那些 Coord 结构而不会抱怨,所以我认为可以将结构分配给枚举,这是可以接受的做法还是不应该这样做?)

4

3 回答 3

5

如果您希望复杂对象静态可用,则需要使用公共静态变量,如下所示:

public class Person
{
    public string FirstName {get; set; }
    public string LastName {get; set; }

    public Person(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

public static class People
{
    public static Person Jack= new Person("Jack", "Andersson");
}

这是因为枚举是特殊构造,在 switch case 构造或管道运算符中具有特殊行为。

编辑:我错了,枚举只是原始类型的语法糖。

我不是专家,所以我不是说我 100% 确定没有其他方法,但我会让你的方向类如下:

private static class Directions
{
    private static readonly Coord UpperLeft = new Coord(-1, -1);
    private static readonly Coord UpperCenter = new Coord(0, -1);
    private static readonly Coord UpperRight = new Coord(1, -1),
    private static readonly Coord Left = new Coord(-1, 0); 
    private static readonly Coord Right = new Coord(1, 0);
    private static readonly Coord LowerLeft = new Coord(-1, 1);
    private static readonly Coord LowerCenter = new Coord(0, 1);
    private static readonly Coord LowerRight = new Coord(1, 1);
};
于 2013-10-03T08:43:26.957 回答
3

您的enum声明是错误的,因为您没有指定要将枚举映射到的类型:

private enum Direction : Coord //good idea, but this won't work ;)
....

但是您不能将枚举映射到结构或类。基于MSDN文档

每个枚举类型都有一个底层类型,它可以是除 char 之外的任何整数类型。枚举元素的默认基础类型是 int。要声明另一个整数类型的枚举,例如字节,请在标识符后使用冒号,后跟类型,如下例所示。

所以,如果你尝试上面的方法,那么你会看到编译器抛出一个合适的,因为Coord不是预期的类型。

我认为解决您的问题的最佳方法是定义一些const变量并使用它们。

于 2013-10-03T08:44:05.460 回答
1

一个简单的转换器怎么样?让我们从枚举开始:

public enum Direction
{
    UpperLeft = 0, // Coord(-1, -1),
    Left = 1, // Coord(-1, 0),
    LowerLeft = 2, // Coord(-1, 1),
    UpperCenter = 3, // Coord(0, -1),
    LowerCenter = 5, // Coord(0, 1),
    UpperRight = 6, // Coord(1, -1),
    Right = 7, // Coord(1, 0),
    LowerRight = 8, // Coord(1, 1)
}

保留你的 Coord 类,并实现一个转换器:

private static Coord ConvertDirectionToCoord(Direction dir)
{
    return new Coord((int)dir / 3 - 1, (int)dir % 3 - 1);
}

你可以这样写你的 ThingThatMovesToTheLeft 类:

public class ThingThatMovesToTheLeft
{
    Direction dir = Direction.Left;
    Coord pos = new Coord(0, 0);
    public void Move()
    {
        this.pos = ConvertDirectionToCoord(this.dir) + this.pos;
    }
}
于 2013-10-03T09:21:39.403 回答