C# 基元类型的运算符重载

C# 基元类型的运算符重载,c#,operator-overloading,primitive,C#,Operator Overloading,Primitive,我使用一个类作为包装器来保存一组表示不同选项或特征的未签名的短裤。每个短路都被初始化为二的幂,因此我可以很容易地将它们相加 public static class Options { public static readonly ushort OPTN0 = 1 << 0; // 0001 public static readonly ushort OPTN1 = 1 << 1; // 0010 public static readonly ush

我使用一个类作为包装器来保存一组表示不同选项或特征的未签名的短裤。每个短路都被初始化为二的幂,因此我可以很容易地将它们相加

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
    ...
}
所以我想知道,对于基元类型,运算符重载是否可能。如果没有,有没有更好的方法来实现这一点?当然,每次投下它都不会让我丧命,但我希望有一种更干净的方式

编辑: 实际上,我用它来渲染很多简单的几何对象(立方体、金字塔等等)。我希望能够快速告诉渲染器要绘制哪些面。如果一个对象上的一个面与另一个对象接触或面朝远离摄影机,我可以设置相应的位,告诉渲染器不要绘制该面。

[Flags]
[Flags]
public enum MyOptions : ushort {
    OPTN0 = 1 << 0,
    OPTN1 = 1 << 1,
    OPTN2 = 1 << 2,
    OPTN3 = 1 << 3,
}
公共枚举选项:ushort{
OPTN0=1看起来您真正想要的是基于ushort的枚举值,如下所示:

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

我相信最接近于2个原语上的运算符重载的方法是生成一个扩展方法。不幸的是,您无法通过这种方式实现真正的运算符重载,但这可能是一个可接受的解决方案:

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


如果您同意更改函数签名,那么像其他答案一样更改为enum也是一个很好的解决方案。

为什么不定义“选项”作为
int
和change
函数使用soptns
获取
int
?您没有使用带有
标志
属性的枚举的任何原因?我尝试使用标志,但除非我做得不对(很可能)我仍然需要强制转换。不幸的是,我不相信你可以在两个原语之间重载运算符,你可以在自定义类或结构和原语之间重载,但不能在两个原语之间重载。强制转换有什么问题?不幸的是,当我这样做时,它仍然让我强制转换。谢谢,这看起来像我可能会做的。还有一个问题n但是,检查另一端的单个位的最佳方法是什么?啊,没关系,HasFlag函数看起来可以很好地工作:)
funcThatUsesOptns(Option.OPTN0 | Option.OPTN1);
public static ushort LogicalOr(this ushort s1, ushort s2)
{
    return (ushort)(s1 | s2);
}
funcThatUsesOptns(Option.OPTN1.LogicalOr(Option.OPTN2));