【问题标题】:Is it possible in .NET 3.5 to specify an enum type?.NET 3.5 中是否可以指定枚举类型?
【发布时间】:2010-05-12 06:40:54
【问题描述】:

我有一个枚举器,它映射到一堆 int

例子

enum MyEnum {
Open = 1,
Closed = 2,
Exit = 4

}

我发现当我想将它分配给一个整数时,我必须先转换它。

int myEnumNumber = **(int)** MyEnum.Open;

是否可以指定枚举的类型,以便隐含地为枚举中的任何值分配一个整数?这样,如果我想使用它,我不需要继续将它转换为 int

谢谢

【问题讨论】:

标签: c# .net .net-3.5 enums


【解决方案1】:

不,这是故意的 - 枚举具有基础数据类型,但它们不被认为是相同的,因为这可能会产生很多错误可能性,而这种方式很容易捕获。

例如,您说了这么多关于必须一直投射 num 的内容 - 我不记得上次我确实做了 enum 的投射。而且我做了很多 C# 编程。

【讨论】:

  • 抱歉,您能详细说明一下吗?您是说将枚举转换为 INT 是不好的编程习惯吗?
  • 好吧,给我举个例子,你需要什么? ;) 我通常使用它: * 数据库映射(一个位置)。 * 标志检查(无论如何都是帮助类,现在在 4.0 中作为方法)还有什么?你为什么要投射它?
  • 哦,好的。我正在使用它,因为我正在从 excel 文件中提取数据。我将其转换为数据表,并使用枚举来访问 Datacolumn 及其与提取中的数据相关的映射。例如。 dr[(int)myEnum.FirstName] 比 dr[4] 更容易理解;你能想出更好的方法吗?
【解决方案2】:
enum MyEnum : int
{
    Open = 1,
    Closed = 2,
    Exit = 4
}

这也提到了here。

但是,这不允许您避免强制转换,这允许它与 Int32 以外的类型(这是默认枚举类型)一起使用。

简而言之,是的,您可以指定一个类型,但不,您仍然必须强制转换它。

【讨论】:

  • 这是否消除了对演员表的需求?这就是我认为@RoboShop 想要的。
【解决方案3】:

将枚举值转换为整数有几个很好的理由,也可能有很多不好的理由,我假设你有充分的理由;)。

如果您正在做大量的 int 转换,扩展方法可能会有所帮助,这里有一个快速的扩展方法:

public static int EnumCast(this Enum theEnum)
{
    return (int)((IConvertible)theEnum);
}

以及一个测试中的使用示例:

[Test]
public void EnumCastTest()
{
    Assert.That(MyEnum.Exit.EnumCast(), Is.EqualTo(4));
}

【讨论】:

  • 我真的看不出这样做有什么好处。您编写的代码比您需要的多,并且枚举转换为 int 无论如何都不会失败。
【解决方案4】:

您可以使用以下方法指定不同的基础类型:

enum : byte MyEnum { ... }

但这并不能消除转换为字节的需要(如果你真的想的话)。 C# 中的枚举通常允许您忘记底层类型,除非您的应用程序需要它。

你真的需要底层整数吗?可以将枚举值的字符串表示形式实际存储在数据库中,然后在稍后从字符串重新创建枚举值see this question。

MSDN 给出了a good tutorial 关于枚举的注意事项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多