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

问题描述 投票:18回答:4

我只需要能够将一个对象强制转换为可为空的枚举。对象可以是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!!
c# enums nullable
4个回答
44
投票

怎么样:

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

从带框的intMyEnum的转换(如果value不为空,然后使用从MyEnumNullable<MyEnum>的隐式转换。

没关系,因为允许您从枚举的框式形式为其基础类型取消装箱,反之亦然。

我相信这实际上是一种转换,不是保证可以通过C#规范工作,但是is可以保证通过CLI规范工作。因此,只要您在CLI实现上运行C#代码(您将是:),就可以了。


13
投票

这是因为您要在单个操作中取消装箱和投射,这是不允许的。您只能将一种类型的框拆开,使其与对象内部的框相同。

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


1
投票

当您将值分配给可为空的类型时,必须注意它与基础类型不同(至少在这种情况下)。因此,要执行投射,您需要先取消装箱:

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

0
投票

有点离题

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

一个应该使用::>

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)解决方案

© www.soinside.com 2019 - 2024. All rights reserved.