繁体   English   中英

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

[英]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;

从装箱intMyEnum (如果value为非空)的转换,然后使用从MyEnumNullable<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM