基元类型的运算符重载

时间:2014-12-19 18:59:36

标签: c# operator-overloading primitive

我使用一个类作为包装器来保存一组代表不同选项或特征的无符号短裤。每个短片被初始化为2的幂,所以我可以轻松地将它们或者它们一起添加。

public static class Options
{
    public static readonly ushort OPTN0 = 1 << 0; // 0001
    public static readonly ushort OPTN1 = 1 << 1; // 0010
    public static readonly ushort OPTN2 = 1 << 2; // 0100
    ...
}


public static void main(string[] args)
{
    funcThatUsesOptns(Option.OPTN0); // works fine
    funcThatUsesOptns(Option.OPTN1 | Option.OPTN2); // fails because '|' returns int
    funcThatUsesOptns((ushort)(Option.OPTN0 | Option.OPTN2)); // works fine
    ...
}

然而,因为&#34; +&#34;和&#34; |&#34;在这种情况下,我都要回归,每次我都要施展它们。例如,a和b都初始化为int:

var a = Option.OPTN0 + Option.OPTN1;
var b = Option.OPTN0 | Option.OPTN1;

所以我想知道运算符重载是否可能用于原始类型。如果没有,有没有更好的方法来实现这一目标?当然,每次投掷它都不会杀了我,但我希望能有更清洁的方式。

编辑: 我实际上是用它来渲染很多简单的几何对象(立方体,金字塔......)。我希望能够快速告诉渲染器哪些面孔可以绘制。如果一个物体上的脸部正在接触另一个物体或背对着相机,我可以设置相应的位以告诉渲染器不要绘制该脸部。

3 个答案:

答案 0 :(得分:0)

[Flags]
public enum MyOptions : ushort {
    OPTN0 = 1 << 0,
    OPTN1 = 1 << 1,
    OPTN2 = 1 << 2,
    OPTN3 = 1 << 3,
}

这应该做你想要的。

答案 1 :(得分:0)

看起来你真正想要的是基于ushort的枚举值,如下所示:

[Flags]
public enum Options : ushort
{
     OPTN0 = 1 << 0, // 0001
     OPTN1 = 1 << 1, // 0010
     OPTN2 = 1 << 2, // 0100    
}

然后,您可以使用内置的|运算符作为枚举。但是,您必须更改方法的签名才能访问Options枚举类型而不是ushort。

funcThatUsesOptns(Option.OPTN0 | Option.OPTN1);

答案 2 :(得分:0)

我相信你最接近2个基元的运算符重载将是一个扩展方法。不幸的是,你不可能以这种方式做一个真正的操作符重载,但它可能是一个可接受的解决方案:

public static ushort LogicalOr(this ushort s1, ushort s2)
{
    return (ushort)(s1 | s2);
}

funcThatUsesOptns(Option.OPTN1.LogicalOr(Option.OPTN2));

如果您可以更改功能签名,则像其他答案一样更改为枚举也是一个很好的解决方案。