C# 3.0 当对象应为空时激发的枚举方法
我使用示例C#控制台应用程序来显示我遇到的错误: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
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.comJaredPar回答了这个问题。我要补充的是,解决方法是将0强制转换为所需方法重载的确切类型
AddWhere("a", (object)0);
如果这就是原因,那么其他整型常量也会选择枚举重载,而输出也会清楚地表明并非如此。0隐式转换为枚举,这种行为是由desgin造成的。@Chris,或者只是添加一个int重载并直接将其转发到object one。@Chris-无需测试值,因为方法重载是在编译时根据变量的类型而不是值选择的。这个问题应该只通过一个文本零来表现,它可以被转换成适当的类型。您可以将任何有效的int传递到枚举中,它只是没有相应的标识符。