Как соединить enum и тип double

200
07 января 2022, 19:50

Есть у меня такая конструкция.

 private  double x1;
        public enum EnumYesNo_for_ball2 
        { 
            Да = x1=5.0,
            Нет = x1=0.0
        }

Естественно что компилятор ругается, вопрос как подружить именно тип данных double с enum. Enum у меня применяется в форме для выбора Да/нет И нужно именно дабловское значение.

Answer 1

Тип double нельзя использовать в enum.
Добавьте вспомогательный метод получения double по значению enum.

private static double GetDoubleByEnum(EnumYesNo_for_ball2 value)
{
    switch (value)
    {
        case EnumYesNo_for_ball2.Да: return 5.0;
        case EnumYesNo_for_ball2.Нет: return 0.0;
        default: return 0.0;
    }
}

Enum:

public enum EnumYesNo_for_ball2
{
    Да,
    Нет
}

Использование:

x1 = GetDoubleByEnum(EnumYesNo_for_ball2.Да); // x1 = 5.0
Answer 2

Есть любопытный хак: https://ideone.com/061J9k

using System;
enum Smth : long
{
  Yes = 0x4014000000000000,
  No = 0x0,
}
static class SmthExts
{
  public static double Value(this Smth x)
  {
    return BitConverter.Int64BitsToDouble((long)x);
  }
}
public class Test
{
  public static void Main()
  {
    Console.WriteLine("0x{0:X}", BitConverter.DoubleToInt64Bits(5));
    Console.WriteLine();
    Console.WriteLine(Smth.Yes.Value());
    Console.WriteLine(Smth.No.Value());
  }
}
Answer 3

раз уж в enum невозможно засунуть дабл, то можно сделать следующий финт хвостом и заменить энам на структуру:

public struct YesNo_for_ball2
{
    public double CurrVal = 0.0; // можно запоминать значение как у нама
    public const double Yes = 5.0;
    public const double No  = 0.0;
}

и если нужно что-то куда-то присвоить то:

double d = YesNo_for_ball2.Yes;
Answer 4
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"Вот тебе дабл {ToDouble(TestEnum.asd1)}");
            Console.WriteLine($"Вот тебе дабл {ToDouble(TestEnum.asd5)}");
            Console.ReadKey();
        }
        static Double ToDouble(TestEnum testEnum)
        {
            return ((Int32)testEnum)*1.0;
        }
    }
    public enum TestEnum: Int32
    {
        asd1 = 1,
        asd5 = 5,
    }
Вот тебе дабл 1
Вот тебе дабл 5

!!! Нужно учесть базовый класс для TestEnum и приведение типа в ToDouble(TestEnum testEnum) что бы не нарваться на выход за пределы мин/макс значений integer