我基本上是一个C#家伙,但最近写了VB.Net代码。
今天我遇到了一个非常不同的.Net
行为C#代码
enum Color
{
Red,
Green,
Blue
}
class Demo
{
public static void Main()
{
System.Console.WriteLine(Color.Red);
}
}
这会打印Red
但是当这段代码用VB.Net编写时,会打印0
。
VB.Net代码
Module Module1
Sub Main()
System.Console.WriteLine(Color.Red)
End Sub
End Module
Enum Color
Red
Green
Blue
End Enum
为何如此不同?
答案 0 :(得分:6)
没有Console.WriteLine(Enum)重载,所以编译器被迫选择其中一个。重载解析规则非常晦涩,VB.NET和C#规则不一样,但是当有隐式转换为目标参数类型时,两个编译器都愿意选择一个并选择一个最少的工作量。
这是另一条规则适用的地方,VB.NET中的这种语句完全有效:
Dim example As Integer = Color.Red '' Fine
但C#编译器吐出:
int example = Color.Red; // CS0266
坚持你应用(int)演员表。它只有一个显式转换,而不是像VB.NET这样的隐式转换。
因此C#编译器将忽略所有带有整数参数的重载,没有一个是候选者,因为它们只存在显式转换。除了一个,Console.WriteLine(Object)重载。那里的是隐式转换,需要装箱转换。
VB.NET编译器也看到它,但现在“更好”的转换发挥作用。拳击转换是一种非常昂贵的转换,转换为Integer
非常便宜。它不需要额外的代码。所以它更喜欢那个。
变通方法很简单:
System.Console.WriteLine(CObj(Color.Red)) '' or
System.Console.WriteLine(Color.Red.ToString())