我只需要能够将一个对象转换为可以为空的枚举。对象可以是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!!
答案 0 :(得分:38)
怎么样:
MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value;
从盒装int
到MyEnum
(如果value
非空),然后使用从MyEnum
到Nullable<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)的解决方案