[英]C# cast object of type int to nullable enum
我只需要能够将对象转换为可为空的枚举。 对象可以是 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# 规范并不能保证它可以工作,但 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) 的解决方案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.