¿Por qué las siguientes dos muestras de código producen resultados diferentes?Sobrecarga de un método en la subclase (Enum vs int)
Caso 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();
}
}
de salida:
Func(int)
Func(EnumType)
Caso 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();
}
}
de salida:
Func(EnumType)
Func(EnumType)
Estoy perplejo. ¿Significa que Func (EnumType) oculta Func (int) declarado en la base? Si este es el caso, ¿por qué el literal 0 es implícitamente enviado a EnumType en el segundo caso sin una advertencia?
EDIT:
No es un comportamiento aún más interesante cuando intento
Console.WriteLine(b.Func(0));
Console.WriteLine(b.Func(1));
Console.WriteLine(b.Func(EnumType.First));
¿Cuál es su conjetura la salida debe ser similar?
aquí está:
Func(EnumType)
Func(int)
Func(EnumType)
Cualquier idea por qué 0 y 1 son tratados de manera diferente?
EDIT 2:
Resulta que literal 0 de hecho tiene un significado especial en C#.
Here y here Encontré una excelente descripción de este comportamiento (ver las respuestas aceptadas).
¿por qué no hay ninguna advertencia en la conversión implícita de int (0) a EnumType? – alexm
Es posible que desee leer más acerca de las conversiones implícitas http://msdn.microsoft.com/en-us/library/aa691280(v=vs.71) –
@atander: todavía hay una diferencia "mágica" entre 0 y 1 (ver mi pregunta editada). Está documentado en alguna parte? – alexm