8

我有以下内容:

MovingDirection.UP;

我想用!运算符如下:

!MovingDirection.Up; // will give MovingDirection.Down

(这是一个枚举)

我努力了:

public static MovingDirection operator !(MovingDirection f)
{
    return MovingDirection.DOWN;
}

...但我收到一个错误:

此一元运算符的参数类型必须是包含类型

有任何想法吗?

4

5 回答 5

8

不,您不能在enums 上实现方法或运算符。您可以创建一个扩展方法

public static MovingDirection Reverse(this MovingDirection direction)
{
    // implement
}

像这样使用:

MovingDirection.Up.Reverse(); // will give MovingDirection.Down

或者您可以使用enum-likeclass而不是实际的enum.

于 2013-10-18T20:02:48.957 回答
0

不是真正的答案,但它有效:

enum MovingDirection : byte { Up = 255, Down = 0 };

MovingDirection t1 = MovingDirection.Up;
MovingDirection t2 = (~t1);
于 2013-10-18T20:27:55.363 回答
0

从理论上讲,这可以通过扩展方法实现,但不幸的是 MS 决定不实现此功能:

http://connect.microsoft.com/VisualStudio/feedback/details/168224/linq-cannot-implement-operator-overloading-as-extension-method

因此,如果您只有 up/down,或者某些方法 IsUp()、IsDown()、...,它要么是布尔值。

于 2013-10-18T20:07:12.027 回答
0

你可以这样做:

private bool isMovingUp(MovingDirection value)
{
    if (value == MovingDirection.UP)
        return true;
     else
        return false;
}

如果你愿意,反之亦然。

或者像 Guthwulf 所说的那样使用布尔值。

于 2013-10-18T20:00:21.017 回答
0

您可以对枚举值进行数字或按位运算,因为枚举是整数。

注意这不一定是一个好主意。甚至可能都不好。但展示了另一种思考枚举的方式。

MovingDirection md = MovingDirection.*; // Some value
md += 1; // If it cannot be cast back to MovingDirection, then it is the default or first value aka 0 (like overflow)
(int)md & 1; // Or do some bitwise operands, like `~` to negate

编辑:显示枚举及其 int 值

enum MovingDirection { UP = 0, DOWN = 1 }
于 2013-10-18T20:14:36.370 回答