Не может преобразовать тип 'Система. Перечисление' к интервалу

virtual: указывает, что метод может быть переопределен переопределением функции inheritor

: переопределяет функциональность виртуального метода в базовом классе, предоставляя различные функции.

new: скрывает исходный метод (который не обязательно должен быть виртуальным), обеспечивая различные функциональные возможности. Это нужно использовать только там, где это абсолютно необходимо.

Когда вы скрываете метод, вы все равно можете получить доступ к исходному методу, доведя его до базового класса. Это полезно в некоторых сценариях, но опасно.

25
задан Benjol 29 October 2009 в 13:03
поделиться

6 ответов

попробуй это ..

m_EnumInterpreter ((int) (object) enumVal);

4
ответ дан Joo Park 28 November 2019 в 20:53
поделиться

Я не знаю, включить ли это в свой вопрос или как ответ. Проблема в том, что это не ответ, а ответ, который мне подходит.

То, что я случайно обнаружил при попытке чего-то другого, это то, что, если я просто втираю это в конец строки, я получаю то, что хочу:

throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal);
//EnumInterpreter returns empty string for enumVal=3720116125

Я фактически упростил до int в моем вопрос, реальный тип данных - uint (в данном конкретном случае). К счастью, учитывая, что я на самом деле хотел только строку, мне не нужно об этом беспокоиться.

Я не уверен, какой из трех других ответов является «правильным», поэтому проголосуйте ...

1
ответ дан Benjol 28 November 2019 в 20:53
поделиться

Почему бы не проанализировать перечисление в строку и вернуть фактическое значение перечисления?

public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 };

string name = MyEnum.Flower.ToString(); // returns "Flower"

Я думаю, что .ToString() устарело, и я не уверен в новом способе сделать это. Я бы подумал, что фактическое представление enum будет более полезным, чем int?

-4
ответ дан bubbleking 28 November 2019 в 20:53
поделиться

System.Enum не может быть напрямую приведен к Integer, но он явно реализует IConvertible, что означает, что вы можете использовать следующее:

public void AddLink(Enum enumVal)
{
    string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal));
    AddLink(identifier);
}

Имейте в виду, что если ваш Enum фактически использует что-то другое, кроме целое число (например, с плавающей точкой), вы потеряете нецелые данные при преобразовании. Или, очевидно, замените вызов Convert тем, из чего вы конвертируете (если это известно)

41
ответ дан 28 November 2019 в 20:53
поделиться

Здесь разные вещи:

1) ответ Райана выглядит нормально, но ... Я бы предпочел передать Enum интерпретатору enum, чтобы вы могли выполнять все операции Convert .Туда. Если вы знаете, что используете ТОЛЬКО целочисленные перечисления, Convert.ToInt32 () вполне подойдет. В противном случае вы можете захотеть добавить, используя отражение или попробуйте / поймать другие преобразования.

2) Вы также можете рассмотреть возможность использования членов класса Enum, таких как .GetName (), .GetValue () и т. Д., Поскольку они имеют дело напрямую с определенными именами и значениями, не зависящими от типа перечисления.

3) технически я бы не выбрасывал исключение за пределы интерпретатора перечисления. Если это условие в целом истинно, вызовите исключение из интерпретатора перечисления, чтобы все использования класса выиграли от проверки. Или вы можете дублировать код.

4) Судя по именованию переменных, у вас есть опыт работы с C ++ / MFC. Возможно, вы захотите ознакомиться с соглашениями об именах в стиле C #, это упростит вам жизнь при использовании / чтении кода и библиотек других людей. Поищите в MS StyleCop хорошее дополнение, помогающее с именами.

1
ответ дан 28 November 2019 в 20:53
поделиться

Нет, вы не можете преобразовать его в int, потому что System.Enum не является перечислением, это просто базовый класс для перечислений.

EDIT:

Вы можете получить значение, как показано ниже, но оно некрасиво:

int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum);
5
ответ дан 28 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: