我只需要能够将一个对象强制转换为可为空的枚举。对象可以是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!!
怎么样:
MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value;
从带框的int
到MyEnum
的转换(如果value
不为空,然后使用从MyEnum
到Nullable<MyEnum>
的隐式转换。
没关系,因为允许您从枚举的框式形式为其基础类型取消装箱,反之亦然。
我相信这实际上是一种转换,不是保证可以通过C#规范工作,但是is可以保证通过CLI规范工作。因此,只要您在CLI实现上运行C#代码(您将是:),就可以了。
这是因为您要在单个操作中取消装箱和投射,这是不允许的。您只能将一种类型的框拆开,使其与对象内部的框相同。
有关详细信息,我建议阅读Eric Lippert的博客:Representation and Identity。
当您将值分配给可为空的类型时,必须注意它与基础类型不同(至少在这种情况下)。因此,要执行投射,您需要先取消装箱:
void Put(object value)
{
if (value != null)
{
System.Nullable<Myenum> val = (System.Nullable<MyEnum>)(MyEnum)value;
}
}
有点离题
对于那些在枚举中未定义值的情况下需要结果为空的人;
一个应该使用::>
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)解决方案