У меня есть такое перечисление (в С#)
public enum Cars
{
Toyota = 'T',
Honda = 'H',
Ford= 'F'
}
И переменная для myCar в VB
Dim myCarValue As String = "H"
Как я могу проверить, является ли myCarValue одним из допустимых значений в перечислении Cars, не сравнивая его с каждым значением в электронном письме? Есть ли способ использовать contains() для этого?
@dbasnett Значения Char, а не строки. Мое перечисление находится на C#, а класс — на VB.
Прочтите о классе Enum и его членах.
Вы можете преобразовать строку в перечисление с помощью Enum.TryParse
Не уверен, что цель дублирования правильна, потому что вопрос задается о преобразовании значения перечисления, но цель дублирования сосредоточена на имени значения.
@PanagiotisKanavos обеспечит ли это эквивалентность значений? Я думаю не в этом случае. Я думаю, использование Enum.GetValues будет более эффективным.
@Rich — символы/строки не допускаются. Только числовые типы.
@PanagiotisKanavos «H» не является допустимым именем. Это ценность. Имя Honda. (Строго говоря, значение имеет "H"C, а не "H".)
@Крэйг, ты прав, я запутался.





В Enums можно использовать только числовые типы. Этот код (изначально VB) просто не компилируется. Вы получите ошибку компилятора:
Преобразование из «Строка» в «целое число» не может происходить в постоянном выражении.
Вы должны выбрать другой подход. Я предлагаю использовать константы и HashSet(Of String) для их хранения:
Public Module Cars
Public Const Toyota = "T", Honda = "H", Ford = "F"
Private ReadOnly _values As HashSet(Of String) = New HashSet(Of String) From {
Toyota,
Honda,
Ford
}
Public Function Contains(carCode As String) As Boolean
Return _values.Contains(carCode)
End Function
End Module
Теперь вы можете выполнить проверку следующим образом:
Dim myCarValue As String = "H"
If Cars.Contains(myCarValue) Then
End If
Вы также можете получить определенное значение с помощью
Dim myCarValue As String = Cars.Toyota
Это очень похоже на то, как вы бы сделали это с Enum.
В C# вы должны использовать static class вместо VB Module. Добавление к именам членов префикса имени модуля (как в Cars.Toyota) необязательно в VB, но обязательно в статических классах C#.
Если значения всегда состоят из одного символа, вы также можете объявить Enum как:
Enum Cars
Totota = Asc("X")
Honda = Asc("H")
Fors = Asc("F")
End Enum
Но тогда проверка становится немного уродливой:
If System.Enum.IsDefined(Of Cars)(Asc(myCarValue)) Then
End If
Обратите внимание, что в C# одинарные кавычки используются для заключения литералов System.Char (C#: char, VB: Char), которые считаются имеющими 16-битный числовой тип (например, System.Short) и неявно преобразуются в целое число в C#. Вот почему ваш фрагмент кода C# работает.
Как у вас есть Enum со строками в качестве значений? Ссылка?