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

dls*_*sou 17 c# enums nullable

我只需要能够将一个对象转换为可以为空的枚举.对象可以是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!!
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 44

怎么样:

MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value;
Run Code Online (Sandbox Code Playgroud)

从盒装转换intMyEnum(如果value为非null)然后使用隐式转换MyEnumNullable<MyEnum>.

这没关系,因为你被允许从枚举的盒装形式拆箱到其底层类型,反之亦然.

我认为,这其实是一个转换并不保证由C#规范工作,但保证通过CLI规范工作.因此,只要您在CLI实现上运行C#代码(您将成为:),您就可以了.

  • +1我每天都发誓我会在StackOverflow的Jon Skeet回复中获得指导.干得好先生. (4认同)

Ree*_*sey 13

这是因为您在单个操作中进行拆箱和转换,这是不允许的.您只能将类型取消装箱到与对象内部装箱相同的类型.

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

  • 实际上,并不完全.请参阅我的答案 - 你可以*从盒装`int`中取消装置到枚举类型(使用`int`作为基础类型),或从盒装枚举值到其基础类型. (2认同)