如何超载! enum的运算符?

时间:2014-05-22 14:49:56

标签: c# enums operator-overloading

我的情况很简单。 我有方向(4个方向)的枚举

enum Direction
{
    Left=1,
    Up,
    Right,
    Down
}

我希望!Direction.Up返回Direction.Down,反之亦然,同样适用于Direction.LeftDirection.Right

我如何实现这一目标?还是有一种更简单的方法来做这个,而不是考虑枚举和重载枚举上的!运算符?

4 个答案:

答案 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

我将使用它,......以及任何其他方向,只是不是旧的。