C#如果第二个参数是枚举,则不能重载+

时间:2013-05-22 18:16:41

标签: c# enums mono operator-overloading

我有以下签名用于重载+

    public static double operator +(MyClass x, MyEnum e)

以及表格形式:

    x.Value = someMyClassValue + MyEnum.X;

调试器显示的行为就像表达式一样:

    x.Value = MyEnum.X;

永远不会调用过载。

我也有:

    public static double operator +(MyClass x, object o)

但是不会为枚举调用它,尽管它适用于其他情况。

我也有字符串,int,float,double的重载,它们都可以完美地工作。为什么enum是一个特例,为什么奇怪的行为呢?这可能是Mono编译器中的错误吗?

我在Ubuntu 13.04上使用Mono 2.10.8.1。

所感

问题在于我还为int定义了一个隐式转换。有关详细信息,请参阅我的回答。

1 个答案:

答案 0 :(得分:0)

问题是我还定义了:

public static implicit operator int(MyClass o)

隐式转换优先于重载的运算符,整个加法表达式采用枚举的类型。

由于我想将隐式转换保留为int,我采用了这个解决方案:

    public enum MyEnum : ulong

有了这个,int的演员阵容就不再发生了。

以下程序演示了我遇到的问题。它的输出是“SECOND”而不是“OK”。

using System;

public class EnumPlus
{
    public enum Constant
    {
        FIRST,
        SECOND
    };

    // if this implicit cast is removed the result is what I expected
    public static implicit operator int(EnumPlus f)
    {
        return 1;
    }

    public static string operator+(EnumPlus o, int i)
    {
        Console.WriteLine("operator + called for int");
        return "BAD";
    }

    public static string operator+(EnumPlus o, Constant Constant)
    {
        Console.WriteLine("operator + called for enum");
        return "OK";
    }

    public static void Main()
    {
        EnumPlus o = new EnumPlus();
        Console.WriteLine(o + Constant.FIRST);
    }

}