2011-08-03 10 views
1

私はVBとC#の列挙型は、同じまたは少なくとも非常に似ていると思った。その後、私はVBコードのバグを見つけました。以下のVBコードをコンパイルし、問題なく動作します:VBでenumsエラー、C#でenumとどのように違うのですか?

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#のenumは異なるのですか?

答えて

4

Why does the VB version not catch the type mismatch?

あなたはすでにバラR —からその答えを得たがOption Strict Onを試してみてください。

Are enum in VB and C# different?

それは(それらが同一CIL「バイトコード」に、すべての確率の結果であることとなりますことができますように、C#とVB.NETの両方で、あなたの宣言が互いに同等であるとされている)が異なることenumは自分自身だではありません。むしろ、コンパイラがコンパイル時に提供する型の安全性/それが許す暗黙の型強制では違うのです。

型の安全性が非常に重要な場合は、おそらくenumが最良の選択肢ではありません。 C#でも、enumタイプの値を別のenumタイプに(明示的に)キャストすることができます。

1

Option Strict VB.NETコンパイルのオプションを指定すると、不一致がキャッチされます。

+0

これは私の質問に答えるが、私はそれらがどのように異なっているかの説明を望んでいた。 –

関連する問題