我有以下签名用于重载+
:
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
定义了一个隐式转换。有关详细信息,请参阅我的回答。
答案 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);
}
}