次の2つのコードサンプルが異なる出力を生成するのはなぜですか?
ケース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)を非表示にすることを意味しますか?この場合、2番目のケースで警告なしにリテラル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#で特別な意味を持っていることがわかります。