Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有十进制值或类似值的枚举_C#_Winforms_Combobox_Enums - Fatal编程技术网

C# 具有十进制值或类似值的枚举

C# 具有十进制值或类似值的枚举,c#,winforms,combobox,enums,C#,Winforms,Combobox,Enums,基本上我想用十进制值定义一个枚举,但这是不可能的。另一种选择是: public static class EstadoRestriccion { public const decimal Valur1 = 0; public const decimal Value2 = 0.5M; public const decimal Value3 = 1; }; 但是我需要在一个组合框中添加这些常量,其中要显示的选项应该是常量的名称,SelectedItem应该返回值(0,0.5

基本上我想用十进制值定义一个枚举,但这是不可能的。另一种选择是:

public static class EstadoRestriccion
{
    public const decimal Valur1 = 0;
    public const decimal Value2 = 0.5M;
    public const decimal Value3 = 1;
};
但是我需要在一个组合框中添加这些常量,其中要显示的选项应该是常量的名称,
SelectedItem
应该返回值(0,0.5M,1)或类似的值。我知道这是可能的,但它是丑陋的

使用enum,我可以轻松地做到这一点:
comboBox.DataSource=enum.GetValues(typeof(MyEnum))


根据我的要求模拟枚举的最佳方法是什么?

十进制的
静态只读数组怎么样

public static readonly decimal[] myValues = new[] {0, 0.5M, 1};

字典可能是个不错的选择

Dictionary
可能是一个很好的候选者-允许您命名值

var values = new Dictionary<string,decimal>();
values.Add("Value1", 0m);
values.Add("Value2", 0.5m);
values.Add("Value3", 1m);
var values=newdictionary();
添加(“值1”,0米);
添加(“值2”,0.5m);
添加(“值3”,1m);

这可以封装在一个类中,这样您只需通过索引公开一个getter,而不是整个
字典
接口。

没有简单的方法<代码>枚举
仅接受整数值。您输入的代码片段很好


const decimal
static readonly decimal
之间有一点差别。一是直接评价;编译器用其值替换名称。相反,
readonly
每次都会通知代码引用字段并从中获取值。您可以观察为什么
readonly
与引用类型一起使用,而
const
不能使用(字符串除外)。

您可以稍微更改您的类:

public class EstadoRestriccion
{
    public static readonly EstadoRestriccion Value1 = new EstadoRestriccion("Value1", 0);
    public static readonly EstadoRestriccion Value2 = new EstadoRestriccion("Value2", 0.5M);
    public static readonly EstadoRestriccion Value3 = new EstadoRestriccion("Value3", 1);
    private static readonly EstadoRestriccion[] values = new EstadoRestriccion[] { Value1, Value2, Value3 };

    private string name;
    private decimal value;

    private EstadoRestriccion(string name, decimal value)
    {
        this.name = name;
        this.value = value;
    }

    public static EstadoRestriccion[] GetValues()
    {
        return values;
    }

    public override string ToString()
    {
        return this.name;
    }
};

一些
十进制
转换和/或将
更改为公共财产。

是。OP在问题中确实提到这是不可能的,但希望有其他选择。我不明白。为什么枚举支持十六进制,但不支持十进制、浮点、双精度???@Overflow012,因为
hexadecimal
实际上是一个整数。
enum
仅支持整数常量,这些常量以常用方式(1、2、4、16、32等)使用,即2的幂。这使程序员能够组合许多选项(例如
FileMode.Open | FileMode.Append
)。但是,
decimal
float
double
类型在C#中不是整数,因此它们不受支持。您也可以让字典
静态只读
,并使用初始值设定项列表静态初始化它。这会更像enum IMO。@Joce-你仍然可以在这样的字典上调用
Add
。你就是无法替换字典。哼。对。:-/有没有办法将字典(或任何类型的复杂对象)声明为编译时常量?@Joce-不太可能。这就是为什么要将这些对象包装在隐藏额外功能的类中。@Overflow012-返回一个副本。或者编写一个可以完成所需工作的包装器(实现迭代器)。