C# 3.0 当对象应为空时激发的枚举方法

C# 3.0 当对象应为空时激发的枚举方法,c#-3.0,C# 3.0,我使用示例C#控制台应用程序来显示我遇到的错误: class Program { public enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri }; static void Main(string[] args) { AddWhere("a", DateTime.Now); AddWhere("a", 0); AddWhere("a", 2); AddWh

我使用示例C#控制台应用程序来显示我遇到的错误:

class Program
{
    public enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

    static void Main(string[] args)
    {
        AddWhere("a", DateTime.Now);
        AddWhere("a", 0);
        AddWhere("a", 2);
        AddWhere("a", 3);
        AddWhere("a", "4");
        AddWhere("a", Days.Sun);
        AddWhere("a", Days.Fri);
        AddWhere("a", 1);
        AddWhere("a", (int)Days.Sat);
        Console.Read();
    }

    public static void AddWhere(string columnName, Days cd)
    {
        Console.WriteLine("enum fired");
    }


    public static void AddWhere(string columnName, object Val)
    {
        Console.WriteLine("object fired");
    }
}
我得到的输出是:

object fired
enum fired
object fired
object fired
object fired
enum fired
enum fired
object fired
object fired

为什么传入0时会触发枚举方法?

因为枚举默认存储为整数,并且当编译器尝试解决最佳方法重载时,它决定
AddWhere(string columnName,Days cd)
更匹配。

C语言规范第1.10节介绍了0的特殊情况

为了使枚举类型的默认值易于使用,文本0隐式转换为任何枚举类型


此隐式转换导致重载解析在
对象上拾取枚举重载。

枚举被激发,因为0是int,而enum基础类型是int。0隐式转换为enum(在编译时),因为此转换是由语言定义的


int a = 123;
long b = a;         // implicit conversion from int to long
int c = (int) b;   // explicit conversion from long to int
某些转换是由语言定义的


来源:msdn.microsoft.com

JaredPar回答了这个问题。我要补充的是,解决方法是将0强制转换为所需方法重载的确切类型

AddWhere("a", (object)0);

如果这就是原因,那么其他整型常量也会选择枚举重载,而输出也会清楚地表明并非如此。0隐式转换为枚举,这种行为是由desgin造成的。@Chris,或者只是添加一个int重载并直接将其转发到object one。@Chris-无需测试值,因为方法重载是在编译时根据变量的类型而不是值选择的。这个问题应该只通过一个文本零来表现,它可以被转换成适当的类型。您可以将任何有效的int传递到枚举中,它只是没有相应的标识符。