我的情况很简单。 我有方向(4个方向)的枚举
enum Direction
{
Left=1,
Up,
Right,
Down
}
我希望!Direction.Up
返回Direction.Down
,反之亦然,同样适用于Direction.Left
和Direction.Right
。
我如何实现这一目标?还是有一种更简单的方法来做这个,而不是考虑枚举和重载枚举上的!
运算符?
答案 0 :(得分:4)
您不能为枚举重载运算符。为了获得该功能,您需要使用类而不是枚举,尽管您可以编写一个在概念上模拟枚举的类。
public class Direction
{
private Direction() { }
public static readonly Direction Up = new Direction();
public static readonly Direction Down = new Direction();
public static readonly Direction Left = new Direction();
public static readonly Direction Right = new Direction();
public static Direction operator !(Direction direction)
{
if (direction == Direction.Up)
return Direction.Down;
else if (direction == Direction.Down)
return Direction.Up;
else if (direction == Direction.Left)
return Direction.Right;
else if (direction == Direction.Right)
return Direction.Left;
throw new Exception("Unreachable");
}
}
答案 1 :(得分:2)
您不能在枚举上重载运算符。 您可以做的是编写扩展方法,但在这种情况下仍然无法使用运算符。
public static Direction Not(this Direction direction) {
switch (direction) {
case Direction.Left: return Direction.Right;
case Direction.Right: return Direction.Left;
case Direction.Up: return Direction.Down;
default: return Direction.Up;
}
}
答案 2 :(得分:1)
你不能在枚举上重载运算符,枚举意味着存储值而不是其他内容。如果要添加任何其他功能,则需要将枚举包装到更高级别的抽象中。
如果我是你,我只会编写一个函数来返回对立面,这是最简单的方法。
Direction Opposite(Direction original)
{
switch (original)
{
case(Direction.Left): return Direction.Right;
case(Direction.Right): return Direction.Left;
case(Direction.Up): return Direction.Down;
case(Direction.Down): return Direction.Up;
default: throw new SomeException("Uncovered direction case. Fix your switch.");
}
}
答案 3 :(得分:0)
这个怎么样?
enum Direction
{
Right= 1,
Left = -1,
Up = 2,
Down = -2
}
您将使用:
newDirection = -oldDirection;
意思是相反的方向。而且意思是:
!oldDirection
我将使用它,......以及任何其他方向,只是不是旧的。