2010-01-20 3 views
2

я пример приложения, 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

Чтобы получить ответ на то, что сказал JaredPar, перечисления не являются ограничителями, они просто спецификаторы. Вы можете передать любой действительный int в перечисление, он просто не будет иметь соответствующий идентификатор, чтобы идти вместе с ним. –

ответ

8

Специальный случай 0 приведен в разделе 1.10 спецификации языка C#.

Для того, чтобы значение по умолчанию типа перечисления, чтобы быть легко доступен, буквальные-неявно преобразует к любому типу перечислимого

Это неявное преобразование вызывает разрешение перегрузки выбрать перегрузку перечислимой на протяжении многих object один.

+0

Итак, чтобы он работал так, как я хочу, мне нужно проверить на 0? – Chris

+0

@Chris, или просто добавьте перегрузку int и перетащите ее прямо на объект. – JaredPar

+0

Ссылка MSDN: http://msdn.microsoft.com/en-us/library/aa691283%28VS.71%29.aspx –

0

Поскольку перечисления хранятся по умолчанию в виде целых чисел, и когда компилятор пытается разрешить перегрузку наилучшего метода, он решает, что AddWhere(string columnName, Days cd) является лучшим совпадением.

0

Enum уволен, потому что 0 является INT и перечисления основного типа INT. неявно преобразован в 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

+0

Если это причина, то все случаи, когда другая интегральная константа также выбирали перегрузку и вывод Enum, явно указывают на другое. – JaredPar

+0

0 неявно преобразован в перечисление, и это поведение происходит от desgin. – Adeel

2

JaredPar ответил на вопрос. Я добавлю, что обход заключается в том, чтобы отличить 0 как точный тип перегрузки требуемого метода.

AddWhere("a", (object)0); 
Смежные вопросы