【问题标题】:C# Cannot overload + if second parameter is an enum如果第二个参数是枚举,C# 不能重载 +
【发布时间】:2013-05-22 18:16:41
【问题描述】:

对于重载的+,我有以下签名:

    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。详情见我的回答。

【问题讨论】:

  • 在 Linqpad 中运行良好。
  • 没有回购。我编写了一个简单的程序并运行它(不是在单声道上),它按预期工作。要么是您未显示的某些代码中存在错误,要么您没有正确观察结果,或者它确实是一个单错误。
  • 可能是因为枚举可以声明为不同的类型。例如,在 VB 中,您可以将枚举声明为字节、整数、短整型、长整型等。编译器不知道该枚举的预期类型。
  • @ps2goat:那不会有任何区别。
  • @ps2goat 注意操作数不是Enum,意思是任何枚举,它是一个特定的枚举类型。不管怎样,就算是Enum,也没关系。

标签: c# enums mono operator-overloading


【解决方案1】:

问题是我还定义了:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多