gpt4 book ai didi

c# - Console.WriteLine(Enum.Value) 在 C# 和 VB.Net 中给出不同的输出

转载 作者:太空狗 更新时间:2023-10-30 00:14:10 24 4
gpt4 key购买 nike

我基本上是个 C# 人,但最近在写 VB.Net 代码。

今天我遇到了一个非常不同的 .Net 行为

C#代码

enum Color
{
Red,
Green,
Blue
}

class Demo
{
public static void Main()
{
System.Console.WriteLine(Color.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

为什么如此不同?

最佳答案

没有 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())

关于c# - Console.WriteLine(Enum.Value) 在 C# 和 VB.Net 中给出不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32167736/

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