C# 需要在c中创建类型为double的枚举#

C# 需要在c中创建类型为double的枚举#,c#,enumeration,C#,Enumeration,如何创建double类型的枚举 是否可能或必须创建某种集合和散列?枚举类型必须是类型,除了char。这不包括double,因此您需要创建一个查找表或一组常量。您不能将其设置为枚举 一种可能性: public static class MyPseudoEnum { public static readonly double FirstVal = 0.3; public static readonly double SecondVal = 0.5; } 我认为byte、sbyte

如何创建double类型的枚举


是否可能或必须创建某种集合和散列?

枚举类型必须是类型,除了
char
。这不包括double,因此您需要创建一个查找表或一组常量。

您不能将其设置为枚举

一种可能性:

public static class MyPseudoEnum
{
    public static readonly double FirstVal = 0.3;
    public static readonly double SecondVal = 0.5;
}

我认为byte、sbyte、short、ushort、int、uint、long或ulong是您唯一的选择


为什么,出于兴趣?也许我们可以解决这个问题。

枚举不能使用double。有关枚举如何工作的说明,请参阅以下MSDN文章:

以下是文章中的一段话,回答了您的问题:

每个枚举类型都有一个基础类型,它可以是除char之外的任何整数类型。枚举元素的默认基础类型是int


不,枚举本质上是整数值

我不知道你正在解决的具体问题,但你可以编一本通用词典


当然,双打的比较总是很有趣的,特别是当它们在小数点处相差很远的时候。如果您尝试将计算结果(相等)与已知的双精度进行比较,可能会很有趣。只是一个警告,如果这是你可能需要做的

我想这取决于你想找多少麻烦。可以将double转换为long,因此,如果在单独的程序中将double值转换为long整数,并输出常量值,则可以在程序中使用它们

顺便说一句,我强烈反对这样做,但有时候你必须做你必须做的事

首先,编写一个程序将双精度转换为长精度:

    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
    }

如果要针对枚举测试双精度值,则必须调用
位转换器.DoubleToInt64Bits()
,并将结果强制转换为枚举类型。要以另一种方式进行转换,请调用
BitConverter.Int64BitsToDouble()

为什么需要使用类型为double的枚举


如果您需要子值,您可以将双精度值与常量运算符相乘,将它们全部转换为整数(并保持相同的比率),然后使用相同的运算符将值转换回双精度值。。。如果乘以几十,就好像将十进制分隔符暂时向左移动一样。简单但有效。

这不会编译。您建议的字段应该是
静态
常量
。为什么选择
静态
而不是
常量
?字符是一个整数值(例如,在大多数ASCII编码中是一个字节)@AZ,tvanfosson所说的是,尽管char是一种整数类型,但它不能用作枚举的基础类型。或者,您可以在枚举旁边创建一个具有所需值的简单数组。然后使用枚举的int值来寻址正确的值。