Enum.TryParse和Enum.IsDefined为char枚举返回false

时间:2016-07-14 16:54:18

标签: c# enums

我的程序如下:

using System;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            char _status = 'C';            
            Console.WriteLine(_status.ToString());            

            if (Enum.IsDefined(typeof(MyStatus), _status.ToString()))
            {
                Console.WriteLine("Yes1");
            }
            else
            {
                Console.WriteLine("No1");
            }

            MyStatus myStatus; 
            if(Enum.TryParse(_status.ToString(), true, out myStatus))
            {
                Console.WriteLine("Yes2");
            }
            else
            {
                Console.WriteLine("No2");
            }
        }

        public enum MyStatus
        {
            None = 'N',
            Done = 'C'
            //Other Enums
        }
    }
}

我期待" Yes1"和" Yes2"在我的控制台中,但看起来它为TryParse和IsDefined返回false。任何帮助表示赞赏。

可以在http://rextester.com/CSFG46040

访问该代码

更新

此值基本上来自数据库并映射到字符字段。我还需要将它暴露给已经使用此字符字段作为枚举的程序。 Enum.IsDefined或Enum.TryParse只是为了确保我没有得到任何其他可以解析为无的垃圾字符。

3 个答案:

答案 0 :(得分:7)

是的,那是因为你的枚举是有效的:

public enum MyStatus
{
    None = 78,
    Done = 67
}

所以" N"既不是枚举值的名称,也不是十进制表示。两者都是"无"和" 78"将解析为MyStatus.None,但是" N"韩元'吨

听起来你很可能想要Dictionary<char, MyStatus>。如果要将每个枚举值的数值视为char,可以使用以下命令构建它:

var dictionary = Enum.GetValues(typeof(MyStatus))
                     .Cast<MyStatus>()
                     .ToDictionary(x => (char) x);

答案 1 :(得分:3)

除了Jon's Answers之外,根据文档Char is also not a valid base type for c# enums

摘录:

  

枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong。

我认为Char是自动Implicitly converted to another type

答案 2 :(得分:3)

Enum.TryParse用于解析枚举元素的 Names 或基础数值的字符串表示(例如"123"的{​​{1}})。如果您已将实际值设为123,则可以使用强制转换:

char

如果您担心它可能不是有效值之一,可以将其与char _status = 'C' var status = (MyStatus)_status; 结合使用:

Enum.IsDefined()