Console.WriteLine(Enum.Value)在C#和VB.Net中提供不同的输出

时间:2015-08-23 14:29:56

标签: c# vb.net enums

我基本上是一个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

为何如此不同?

1 个答案:

答案 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())