当对象应该被触发时枚举的方法

时间:2010-01-20 16:43:16

标签: 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);
        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时会激活枚举方法?

4 个答案:

答案 0 :(得分:8)

C#语言规范的1.10部分介绍了0的特例。

  

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

这种隐式转换导致重载解析选择object上的enum重载。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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


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