我正在使用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结构,所以我认为可以将结构分配给枚举,这是可以接受的做法还是应该这样做?)
答案 0 :(得分: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");
}
这是因为Enums是特殊结构,在switch case结构或管道运算符中具有特殊行为。
编辑:我错了,枚举只是原始类型的语法糖。
我不是专家,所以我并不是说我百分百肯定没有其他办法,但我会让你的指示类似:
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);
};
答案 1 :(得分:3)
您的enum
声明是错误的,因为您没有指定您将枚举映射到的类型:
private enum Direction : Coord //good idea, but this won't work ;)
....
但是您无法将枚举映射到结构或类。基于MSDN文档
每个枚举类型都有一个基础类型,可以是除char 之外的任何整数类型。枚举元素的默认基础类型是int。要声明另一个整数类型的枚举,例如byte,请在标识符后跟类型后使用冒号,如下例所示。
因此,如果您尝试上述操作,那么您将看到编译器抛出拟合,因为Coord
不是预期的类型。
我认为解决问题的最佳方法是定义一些const
变量并使用它们。
答案 2 :(得分: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;
}
}