Перегрузка метода в подклассе (Enum vs int)

Почему следующие два примера кода выдают разные результаты?

Случай 1

enum EnumType
{
    First,
    Second,
    Third
}

class ClassB
{
    public string Func(int index)
    {
        return "Func(int)";
    }

    public string Func(EnumType type)
    {
        return "Func(EnumType)";
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassB b = new ClassB();
        Console.WriteLine(b.Func(0));
        Console.WriteLine(b.Func(EnumType.First));
        Console.ReadLine();
    }
}

Выход:

Func(int)
Func(EnumType)

Случай 2

enum EnumType
{
    First,
    Second,
    Third
}

class ClassA
{
    public string Func(int index)
    {
        return "Func(int)";
    }
}

class ClassB : ClassA
{
    public string Func(EnumType enumType)
    {
        return "Func(EnumType)";
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassB b = new ClassB();
        Console.WriteLine(b.Func(0));
        Console.WriteLine(b.Func(EnumType.First));
        Console.ReadLine();
    }
}

Выход:

Func(EnumType)
Func(EnumType)

Я озадачен. Означает ли это, что Func (EnumType )скрывает объявленный в базе Func (int )? Если это так, то почему литерал 0 неявно приводится к EnumType во втором случае без предупреждения?

РЕДАКТИРОВАТЬ:

Есть еще более интересное поведение, когда я пытаюсь

Console.WriteLine(b.Func(0));         
Console.WriteLine(b.Func(1));
Console.WriteLine(b.Func(EnumType.First));

Как, по вашему мнению, должен выглядеть вывод?

вот он:

 Func(EnumType)
 Func(int)
 Func(EnumType)

Любые идеи, почему 0 и 1 обрабатываются по-разному?

РЕДАКТИРОВАТЬ 2:

Оказывается, литерал 0 действительно имеет особое значение в C #.

Здесь и здесь я нашел отличное описание этого поведения (см. принятые ответы ).

6
задан Community 23 May 2017 в 11:56
поделиться