enums error в vb, чем он отличается от enums в c #? - PullRequest
1 голос
/ 03 августа 2011

Я думал, что перечисления в VB и C #, где то же самое или, по крайней мере, очень похоже.Тогда сегодня я наткнулся на ошибку в нашем коде VB.Следующий код VB компилируется и запускается без проблем:

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 не улавливает несоответствие типов?Различаются ли enum в VB и C #?

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Почему версия VB не улавливает несоответствие типов?

Вы уже получили ответ на этот вопрос от Bala R & mdash; попробуйте Option Strict On.

Различаются ли enum в VB и C #?

Это не сами enum, которые отличаются (ваши объявления как в C #, так и в VB.NET настолько эквивалентны друг другу, насколько они могут быть, и, по всей вероятности, приведут к одинаковому "байт-коду" CIL). Скорее, компиляторы отличаются безопасностью типов, которую они обеспечивают во время компиляции / неявным приведением типов, которое они допускают.

Если безопасность типов очень важна для вас, тогда, вероятно, enum не лучший вариант. Даже C # позволяет (явно) приводить значение одного типа enum к другому типу enum.

1 голос
/ 03 августа 2011

Включите параметр Option Strict для компиляции VB.NET, и он обнаружит несоответствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...