2011-08-03 38 views
1

我以为在VB和C#中枚举相同或至少非常相似。然后今天我偶然发现了我们VB代码中的一个错误。以下VB代码编译和运行没有问题:在VB中枚举错误,它是如何不同于在C#中的枚举?

Enum Cars 
    Subaru 
    Volvo 
End Enum 

Enum Vegtables 
    Carrots 
    Beets 
End Enum 

Sub Main() 
    Foo(Cars.Subaru) 
    Foo(Vegtables.Carrots) 
End Sub 

Public Sub Foo(ByVal value As Cars) 
End Sub 

但在C#中的等价正确地显示了一个错误:

enum Cars 
{ 
    Subaru, 
    Volvo 
} 

enum Vegtables 
{ 
    Carrots, 
    Beets 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo(Cars.Subaru); 
     Foo(Vegtables.Carrots);//<-- C# detects a type mismatch here 
    } 

    public static void Foo(Cars carsValue) 
    {} 
} 

为什么VB的版本没有赶上类型不匹配?在VB和C#中枚举不同?

回答

4

Why does the VB version not catch the type mismatch?

您已经有了一个答案,从巴拉 - [R —尝试Option Strict On

Are enum in VB and C# different?

这不是enumš本身是不同的(你在C#声明和VB.NET是等同于彼此,因为他们可以和将在所有的概率导致相同CIL“字节码”)。相反,编译器在编译时提供的类型安全性不同,它们允许的隐式类型强制。

如果类型安全对你来说非常重要,那么enum小号可能不是最好的选择。即使C#也允许你(明确地)将一个enum类型的值转换为不同的enum类型。

1

打开Option Strict选项VB.NET编译,它会赶上不匹配。

+0

这回答我的问题,但我希望解释他们是如何不同。 –