有没有办法为枚举类型实现一元运算符?

时间:2013-10-18 19:53:50

标签: c# enums operators unary-operator

我有以下内容:

MovingDirection.UP;

我想用!运算符如下:

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

(这是一个枚举)

我试过了:

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

...但收到错误:

  

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

有什么想法吗?

5 个答案:

答案 0 :(得分:8)

不,您无法在enum上实施方法或运算符。您可以创建extension method

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

使用类似:

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

或者您可以使用enum-like class代替实际的enum

答案 1 :(得分:0)

你可以这样做:

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

,反之亦然。

或者像古斯沃夫所说的那样使用布尔。

答案 2 :(得分:0)

理论上,这可能是通过扩展方法实现的,但不幸的是,MS决定不实施这个特性:

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

所以如果你只有up / down,或者某些方法是IsUp(),IsDown(),那么它是boolean。

答案 3 :(得分: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 }

答案 4 :(得分:0)

不是一个真正的答案,但它确实有效:

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

MovingDirection t1 = MovingDirection.Up;
MovingDirection t2 = (~t1);