Почему следующие два примера кода выдают разные результаты?
Случай 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 #.
Здесь и здесь я нашел отличное описание этого поведения (см. принятые ответы ).