gpt4 book ai didi

c# - 重载子类中的方法(Enum vs int)

转载 作者:太空狗 更新时间:2023-10-29 21:40:39 24 4
gpt4 key购买 nike

为什么以下两个代码示例会产生不同的输出?

案例一

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)

案例二

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# 中确实具有特殊含义。

Herehere我找到了对此行为的出色描述(请参阅已接受的答案)。

最佳答案

是的,它确实隐藏了类 A 中声明的 Func(int)。

此外,请参阅enum (C# Reference)

The default underlying type of enumeration elements is int

您可能还想看看 Polymorphism (C# Programming Guide)

编辑

如果你要改变

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

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

你会发现输出应该是

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

如果直接传递给函数调用,似乎 0 被隐式转换为默认枚举值。

编辑 2

我检查了 IL 代码,它似乎确实将 0 隐式转换为枚举

IL_0000: nop
IL_0001: newobj instance void ClassB::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.0
IL_0009: callvirt instance string ClassB::Func(valuetype EnumType)
IL_000e: call void [mscorlib]System.Console::WriteLine(string)
IL_0013: nop
IL_0014: ldloc.0
IL_0015: ldc.i4.0
IL_0016: callvirt instance string ClassB::Func(valuetype EnumType)
IL_001b: call void [mscorlib]System.Console::WriteLine(string)
IL_0020: nop
IL_0021: call string [mscorlib]System.Console::ReadLine()
IL_0026: pop
IL_0027: ret

关于c# - 重载子类中的方法(Enum vs int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11516011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com