Нужно сделать перечисление типа double в С#

Как я могу создать перечисление типа double?

Возможно ли или мне нужно создать какую-то коллекцию и хэш?


person Community    schedule 17.03.2009    source источник


Ответы (7)


Вы не можете сделать это перечислением.

http://msdn.microsoft.com/en-us/library/y94acxy2.aspx

Одна из возможностей:

public static class MyPseudoEnum
{
    public static readonly double FirstVal = 0.3;
    public static readonly double SecondVal = 0.5;
}
person user76035    schedule 17.03.2009
comment
Это не скомпилируется. Рекомендуемые поля должны быть static или const. - person Jay Bazuzi; 17.03.2009
comment
В чем причина предпочесть static const? - person Johnny5; 12.09.2012

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

Между прочим, я бы категорически не одобрял этого, но иногда нужно делать то, что должен делать.

Во-первых, напишите программу для преобразования ваших двойников в длинные:

    Console.WriteLine("private const long x1 = 0x{0:X16}L;", 
        BitConverter.DoubleToInt64Bits(0.5));
    Console.WriteLine("private const long x2 = 0x{0:X16}L;", 
        BitConverter.DoubleToInt64Bits(3.14));

Теперь добавьте этот вывод в свою программу и создайте перечисление:

    private const long x1 = 0x3FE0000000000000L;
    private const long x2 = 0x40091EB851EB851FL;

    enum MyEnum : long
    {
        val1 = x1,
        val2 = x2
    }

Если вы хотите проверить двойное значение на перечисление, вам придется вызвать BitConverter.DoubleToInt64Bits() и привести результат к вашему типу перечисления. Чтобы конвертировать в другую сторону, вызовите BitConverter.Int64BitsToDouble().

person Jim Mischel    schedule 17.03.2009

Нет, перечисления по сути являются целыми значениями.

Я не знаю о вашей конкретной проблеме, которую вы решаете, но вы могли бы сделать общий словарь.

Конечно, сравнение двойников всегда забавно, особенно когда они сильно различаются в десятичных разрядах. Может быть интересно, если вы попытаетесь сравнить результаты вычисления (на равенство) с известным двойником. Просто предостережение, если это то, что вам может понадобиться сделать.

person itsmatt    schedule 17.03.2009

Типы перечисления должны быть типами интегральными, с за исключением char. Это не включает double, поэтому вам нужно будет создать таблицу поиска или набор констант.

person tvanfosson    schedule 17.03.2009
comment
char является целочисленным значением (например, байт в большинстве кодировок ASCII) - person Adrian Zanescu; 17.03.2009
comment
@AZ, тванфоссон говорит, что, хотя char является интегральным типом, его нельзя использовать в качестве базового типа для перечисления. - person LukeH; 17.03.2009

Я думаю, что byte, sbyte, short, ushort, int, uint, long или ulong — ваши единственные варианты.

Почему ради интереса? Может быть, мы сможем обойти это.

person amaca    schedule 17.03.2009

Невозможно использовать double для перечисления. См. следующую статью MSDN для объяснения того, как работают перечисления:

Статья MSDN

Вот цитата из статьи, которая отвечает на ваш вопрос:

Каждый тип перечисления имеет базовый тип, который может быть любым целочисленным типом, кроме char. Базовым типом элементов перечисления по умолчанию является int.

person Kelsey    schedule 17.03.2009

Зачем вам нужно использовать перечисление типа double?

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

person Stijn Bollen    schedule 22.03.2012
comment
Или вы можете просто создать простой массив с необходимыми значениями рядом с перечислением. Затем используйте для перечисления int значение, чтобы адресовать правильное значение. - person Stijn Bollen; 04.02.2013