c# - Enum.Parse 方法返回一个不同于作为参数传递给它的枚举成员

标签 c# enums

我希望以下对 Parse 方法的调用返回枚举成员 EN_CA,但它返回的是 EN。

Enum.Parse(LanguageType, "EN_CA", true);

哪里:

enum LanguageType
{
  EN = 0,
  EN_CA = 0,
  FR = 1
}

似乎 Parse 方法只是获取映射到传递给它的参数值的第一个成员。Parse 方法似乎在从字符串到枚举成员的转换过程中丢失了信息。更改 EN_CA 和 EN 的顺序将使上述调用返回 EN_CA,但这不会解决问题,因为在调用“EN”的方法时会导致类似的问题。

其他上下文相关信息:在我的代码中,LanguageType 枚举表示字典的索引,这些索引用于本地化语言。

有没有人知道如何将两个枚举成员映射到相同的值,同时能够从 Enum.Parse 获得适当的成员?我是否只需要实现我自己的 Enum.Parse 版本,它不会将具有相同值的成员折叠成一个?

最佳答案

一个枚举成员与其他枚举成员不同,当且它具有不同的值。实际上,枚举的成员被命名为常量,除了它们所持有的值外,它们之间没有真正的区别。

在您的 LanguageType 枚举中,您有两个相同值的标签,但无法区分它们。试试这个:

Console.WriteLine("{0} == {1} ? {2}", 
    LanguageType.EN.ToString(), 
    LanguageType.EN_CA.ToString(),
    LanguageType.EN == LanguageType.EN_CA);

输出是:

EN == EN ? True

当您将 LanguageType.EN_CA 分配给一个变量时,会发生同样的事情,然后稍后检查该变量以查看它包含的内容。你得到的是 LanguageType.EN

这里的关键是成员的在大多数情况下是最重要的,而成员的位置是冲突期间的决胜局。当两个成员具有相同的值时,首先声明的成员就是您在进行字符串转换时会看到的成员,包括在 IDE 中检查该值时。

因此实际上您有一个值 LanguageType.EN_CA,它只是值 LanguageType.EN 的别名。

虽然我可以想到一些可爱的用途——比如解析具有相同值的多种表示形式的传入数据——但在大多数现实世界中,这确实是一件非常糟糕的事情环境,尤其是如果您希望能够进行完全对称的序列化/反序列化。

现在,关于您的本地化 Dictionary...

在字典中多次存储同一个类对象的成本非常低,因为类对象是通过引用存储的。假设您有一个 Localization 类,以下代码在存储方面并不是特别低效:

enum LanguageType
{
    EN, EN_CA, EN_US, EN_GB, EN_AU, FR
}


Dictionary<LanguageType, Localization> localizations = new Dictionary<LanguageType, Localization>();

localizations[LanguageType.EN] = new Localization("EN");
localizations[LanguageType.EN_CA] = localizations[LanguageType.EN];
localizations[LanguageType.EN_US] = localizations[LanguageType.EN];
localizations[LanguageType.EN_GB] = localizations[LanguageType.EN];
localizations[LanguageType.EN_AU] = localizations[LanguageType.EN];

即使 Localization 对象包含大量资源,上面的代码也只会创建它的一个实例。您为 LanguageType 成员获取不同的值,Dictionary 为您进行映射。

关于c# - Enum.Parse 方法返回一个不同于作为参数传递给它的枚举成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388436/

相关文章:

c# - 如何在应用程序中禁用 Aero Snap?

c# - Json 获取值类型的标题而不是对象

python - 从枚举中获取所有值,当值在 Python 3.7 中是可调用的

c# - 如何在 Windows Phone 8.1 中进行 0 腿 OAuth

c# - 从两个单独的变量 C# 创建 double 值

C# System.Drawing 引用问题

TypeScript:从枚举类型推断枚举值类型

c# - 接受多种枚举类型的方法

java - 如何在多个 Enum 中重用代码

c# - 为什么标志枚举通常用十六进制值定义