gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:20 24 4
gpt4 key购买 nike

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

    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 的重载,它们都能完美运行。为什么枚举是一个特例,为什么会有奇怪的行为?这可能是 Mono 编译器中的错误吗?

我在 Ubuntu 13.04 上使用 Mono 2.10.8.1。

后记

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

最佳答案

问题是我还定义了:

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

}

关于C# 不能重载 + 如果第二个参数是一个枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com