【问题标题】:Casting Between Enums in C# [duplicate]C#中枚举之间的转换[重复]
【发布时间】:2012-10-04 04:39:00
【问题描述】:

可能重复:
convert an enum to another type of enum

在不同类型的枚举之间进行转换时,是否可以像这样直接从一种类型转换为另一种类型?

LicenseTypes type;
TypeOfLicense type2;

type2 = (TypeOfLicense)type;

或者是否有必要先将枚举转换为 int?编译器不会抱怨,但我想确保我不会在运行时遇到某种时髦的强制转换异常。

这似乎是一件奇怪的事情,但两个枚举在结构和值上是相同的。在这种情况下,只有类型名称不同。

【问题讨论】:

    标签: c# .net casting enums


    【解决方案1】:

    虽然它是重复的,但我也标记了它。你可以做简单的转换,因为底层类型是int,你可以这样做:

    LicenseTypes type = (LicenseTypes)TypeOfLicense.value3;
    

    这里type 将保持值'0';

    假设你有:

    public enum LicenseTypes 
    {
        value1,
        value2,
    }
    public enum TypeOfLicense
    {
        value3, 
        value4,
        value5
    }
    

    但是如果你尝试 Cast TypeOfLicence.value5 那么变量 type 将保存 int 值 2

    LicenseTypes type = (LicenseTypes)TypeOfLicense.value5;
    

    您还可以查看此link 以创建用于枚举之间转换的扩展方法。 (这是类似问题的公认答案)

    【讨论】:

    • 我看到了另一个问题,但直到现在我才看到最后一个答案。其他一切都比它必须的复杂得多。
    • @BasedAsFunk,我相信您甚至不需要转换为int,您可以使用转换为:LicenseTypes type = (LicenseTypes)TypeOfLicense.value3;
    【解决方案2】:

    不,但你可以做一些假设...

    LicenseTypes type = LicenseTypes.Type1;
    TypeOfLicense type2 = TypeOfLicense.Type2;
    
    type2 = (TypeOfLicense)(int)type;
    

    ...这些假设就是这样。我们必须假设 LicenseTypesTypeOfLicense 都基于 int 的价值。我们还必须假设,从业务角度来看,将基础价值相互转换是相关的(但从技术角度来看,这实际上既不存在也不存在)。

    请注意,这适用于其他基本类型,并且可以构建更复杂的转换,允许您通过转换在不同类型之间进行转换。

    【讨论】:

    • 这个假设是正确的,我有两个相同的枚举类型,但第一个在新程序集中不可见。现在回想起来,还有其他方法可以解决这个问题(使用直接 int 会很好),但我不再有时间回去以“正确”的方式去做。
    • @BasedAsFunk:是的,这就是应用程序经常进入它们的生活之后的样子,所以你只需尽可能地解决它们。
    • +1。如果基本类型不同,转换可能会丢失精度(BasedAsFunk 可以,因为枚举是相同的)。
    【解决方案3】:

    不管你怎么做,它只是将整数赋值给另一个变量。请记住,枚举在内部被视为整数,因此没有区别。

    【讨论】:

    • 这并不完全正确 - 基础类型是任何整数类型。 IE。如果源类型为enum Noraml{} 目标类型为enum Small:byte{},则转换时可能会丢失精度。
    • 在这种情况下你是对的。当两个枚举类型不同时,它成立。
    猜你喜欢
    • 2017-10-08
    • 2016-01-02
    • 2012-05-16
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多