C#将int类型的对象转换为可以为空的枚举

时间:2011-03-04 21:23:06

标签: c# enums nullable

我只需要能够将一个对象转换为可以为空的枚举。对象可以是enum,null或int。谢谢!

public enum MyEnum { A, B }
void Put(object value)
{
    System.Nullable<Myenum> val = (System.Nullable<MyEnum>)value;
}

Put(null);     // works
Put(Myenum.B); // works
Put(1);        // Invalid cast exception!!

4 个答案:

答案 0 :(得分:38)

怎么样:

MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value;

从盒装intMyEnum(如果value非空),然后使用从MyEnumNullable<MyEnum>的隐式转换。< / p>

没关系,因为你可以从枚举的盒装形式拆箱到其底层类型,反之亦然。

我认为这实际上是一个保证可以通过C#规范工作的转换,但 保证可以通过CLI规范工作。所以,只要你在CLI实现上运行你的C#代码(你将会是:),你会没事的。

答案 1 :(得分:12)

这是因为您在单个操作中拆箱并进行转换,这是不允许的。您只能将类型取消装箱到对象内部装箱的相同类型。

有关详情,我建议阅读Eric Lippert的博客:Representation and Identity

答案 2 :(得分:1)

当您为可归类型赋值时,您必须知道它与底层类型不同(至少在这种情况下)。因此,为了执行演员表,您需要先取消装箱:

void Put(object value)
{
    if (value != null)
    {
        System.Nullable<Myenum> val = (System.Nullable<MyEnum>)(MyEnum)value;
    }
}

答案 3 :(得分:1)

有点题外话

对于那些在枚举中未定义值时需要结果为空的人;

一个人应该使用:

typeof(MyEnum).IsEnumDefined(val)

Enum.IsDefined(typeof(MyEnum), val)

这是用法示例:

enum MyEnum { one = 1, three = 3, four=4 }

static MyEnum? CastIntAsNullableEnum(int value) 
{
    if (!Enum.IsDefined(typeof(MyEnum), value)) return null;
    return (MyEnum?)value;            
}

static void CastIntAsNullableEnumTest()
{
    for(int i =0; i<=5; i++)
    {
        Console.WriteLine("converted {0} is {1}", i, CastIntAsNullableEnum(i));
    }                        
}

感谢John Thiriet(johnthiriet.com)的解决方案