Perché i seguenti due esempi di codice producono output diversi?Sovraccarico di un metodo nella sottoclasse (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();
}
}
uscita:
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();
}
}
uscita:
012.351.Func(EnumType)
Func(EnumType)
Sono perplesso. Significa che Func (EnumType) nasconde Func (int) dichiarato nella base? Se questo è il caso, perché il letterale 0 è implicitamente assegnato a EnumType nel secondo caso senza un avviso?
EDIT:
C'è un comportamento ancora più interessante quando provo
Console.WriteLine(b.Func(0));
Console.WriteLine(b.Func(1));
Console.WriteLine(b.Func(EnumType.First));
Qual è il tuo indovinare l'uscita dovrebbe essere simile?
qui è:
Func(EnumType)
Func(int)
Func(EnumType)
Tutte le idee perché 0 e 1 vengono trattati in modo diverso?
EDIT 2:
Si scopre che letterale 0 ha infatti un significato speciale in C#.
Here e here Ho trovato un'eccellente descrizione di questo comportamento (vedere le risposte accettate).
perché non vi è alcun avviso sulla conversione implicita da int (0) a EnumType? – alexm
Si potrebbe voler leggere un po 'di più sulle conversioni implicite http://msdn.microsoft.com/en-us/library/aa691280(v=vs.71) –
@atander: c'è ancora una differenza "magica" tra 0 e 1 (vedi la mia domanda modificata). È documentato da qualche parte? – alexm