我如何重载运营商在C#中的枚举?(How do I overload an operator for

2019-07-04 03:19发布

我有一个枚举类型,我想以限定><>= ,和<=运营商。 我知道,这些运营商正在implictly枚举类型的基础上创建(根据文件 ),但我想显式定义这些运营商(为清楚起见,控制,要知道怎么做了,等...)

我希望我可以这样做:

public enum SizeType
{
    Small = 0,
    Medium = 1,
    Large = 2,
    ExtraLarge = 3
}

public SizeType operator >(SizeType x, SizeType y)
{

}

但是,这似乎并没有工作(“意外的标记”)......这可能吗? 现在看来似乎应该是因为有implictly定义操作。 有什么建议?

Answer 1:

你不能做到这一点。 你可以只提供重载运算类和定义结构 - 和参数中的至少一个应该是类型的类的或结构本身。 也就是说,你可以声明重载加法操作,增加了一个MyClass ,以MyEnum但你永远无法做到这一点有两个MyEnum值。



Answer 2:

至于其他前面提到的,一个人不能凌驾于枚举运营商,但你可以做到这一点的结构。 请参见下面的示例。 让我知道,如果它帮助:

public struct SizeType
{
    private int InternalValue { get; set; }

    public static readonly int Small = 0;
    public static readonly int Medium = 1;
    public static readonly int Large = 2;
    public static readonly int ExtraLarge = 3;

    public override bool Equals(object obj)
    {
        SizeType otherObj = (SizeType)obj;
        return otherObj.InternalValue.Equals(this.InternalValue);
    }

    public static bool operator >(SizeType left, SizeType right)
    {
        return (left.InternalValue > right.InternalValue);
    }

    public static bool operator <(SizeType left, SizeType right)
    {
        return (left.InternalValue < right.InternalValue);
    }

    public static implicit operator SizeType(int otherType)
    {
        return new SizeType
        {
            InternalValue = otherType
        };
    }
}

public class test11
{
    void myTest()
    {
        SizeType smallSize = SizeType.Small;
        SizeType largeType = SizeType.Large;
        if (smallSize > largeType)
        {
            Console.WriteLine("small is greater than large");
        }
    }
}


Answer 3:

根据ECMA-335通用语言基础:

所述CTS支持枚举(也称为枚举类型),对于现有类型的替代名称。 用于匹配的签名的目的,一个枚举不得相同的基础类型。 枚举的实例,但是,应当分配到的基本类型,反之亦然。 也就是说,没有铸造(见§8.3.3)或胁迫(见§8.3.2)需要从枚举转换为基础类型,也不会从底层类型枚举必需的。 枚举是大大超过真正的类型受到限制,如下所示:它应具有正好一个实例字段,并且该字段的类型定义了基础类型枚举的。

  • 它不应有任何自己的方法。
  • 它应当自System.Enum( - 内核包请参阅分区IV库)获得。
  • 它不得实施其自己的任何接口。
  • 它不应有任何属性或它自己的事件。
  • 它不应有任何静态字段,除非它们是文字。 (见§8.6.1.2)

让我们假设我们有以下的IL代码:

.class public auto ansi sealed Test.Months extends [mscorlib]System.Enum
{
  .field public specialname rtspecialname int32 value__
  .field public static literal valuetype Test.Months January = int32(0x00000001)
  .field public static literal valuetype Test.Months February = int32(0x00000002)
  .field public static literal valuetype Test.Months March = int32(0x00000003)
  // ...

  .method public hidebysig specialname static valuetype Test.Months 
  op_Increment(valuetype Test.Months m) cil managed
  {
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: ldc.i4.s 10
    IL_0003: add
    IL_0004: ret
  }
} // end of class Test.Months

MSIL编译器程序(Ilasm.exe)将产生以下错误:

  错误 - 枚举法  *****故障***** 

因此,我们不能超载枚举运营商甚至在编辑的IL代码;)



Answer 4:

作为迈赫达德说,你不能这样做对枚举本身。 但是你可以做一对夫妇是在你工作的枚举扩展方法。 这将使它看起来像枚举的方法。

static bool IsLessThan(this SizeType first, SizeType second) {
}


Answer 5:

你不能覆盖的compareTo方法,但您可以添加一个扩展方法:

<Runtime.CompilerServices.Extension()> 
Public Function Compare(ByVal obj1 As EnumType, ByVal obj2 As EnumType) as integer
    Dim CompareResults as integer = 0
    'some code  here to do your comparison
    Return CompareResults
End Sub

然后如下执行:

IntegerResult = myEnum.Compare(otherEnum)

从http://msdn.microsoft.com/en-us/library/bb384936.aspx



文章来源: How do I overload an operator for an enumeration in C#?