2

我有以下重载签名+

    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)

但这对于枚举也不会被调用,尽管它对于其他情况也是如此。

我也有 string、int、float、double 的重载,它们都工作得很好。为什么 enum 是一个特例,为什么会有奇怪的行为?这可能是 Mono 编译器中的错误吗?

我在 Ubuntu 13.04 上使用 Mono 2.10.8.1。

后记

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

4

1 回答 1

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);
    }

}
于 2013-05-22T22:53:46.163 回答