【问题标题】:Why the enum parameter can NOT accept the int value(>0) in overload method为什么枚举参数不能接受重载方法中的int值(> 0)
【发布时间】:2019-05-22 20:50:25
【问题描述】:

这是我的代码:

public class Program
{
    public enum SexEnum{
        Male,
        Female
    }

    public static void Test(SexEnum s){
        Console.WriteLine("enum...");
    }


    public  static void Test(Object s){
        Console.WriteLine("object...");
    }

    public static void Main(string[] args)
    {
        Test(0);
        Test(1);
    }
}

但实际结果是:

enum...  
object...

为什么在重载方法中枚举参数不能接受int值(>0)?

【问题讨论】:

  • 为了获得更多乐趣,请尝试添加一个接受int 的重载。这种行为都有完整的文档记录,但说明了重载的危险。
  • 只有值 0 具有到枚举的隐式转换。如果您希望这是可预测的,那么您需要一个带有 int 参数的重载,应用 (SexEnum) 强制转换。或者根本不使用 int,值应该在调用者中转换。

标签: c# enums


【解决方案1】:

这在语言规范中明确规定,第 6.1.3 节隐式枚举转换(强调我的):

隐式枚举转换允许十进制-整数-文字 0 被转换为任何枚举类型和任何可空类型,其 基础类型是枚举类型。在后一种情况下,转换是 通过转换为基础枚举类型并包装 结果

所以只有文字 0 可以隐式转换为任何枚举,而不是 1,不是 2,只有 0

这可以通过删除采用Object 的重载来进一步证明,Test(1) 将无法编译。

至于为什么语言是这样设计的,你得问问语言设计者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多