Метод enum запускается, когда объект должен быть - PullRequest
2 голосов
/ 20 января 2010

Я пример консольного приложения 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

Почему метод enum срабатывает, когда передается 0?

Ответы [ 4 ]

8 голосов
/ 20 января 2010

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

Чтобы значение по умолчанию типа enum было легко доступно, литерал 0 неявно преобразуется в любой тип enum

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

2 голосов
/ 20 января 2010

ДжаредПар ответил на вопрос. Я добавлю, что обходной путь - привести 0 к точному типу требуемой перегрузки метода.

AddWhere("a", (object)0);
0 голосов
/ 20 января 2010

Enum сработал, потому что 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

0 голосов
/ 20 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...