我是一个示例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时会激活枚举方法?
答案 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