在检查变量是否为枚举值时,为什么不能使用'as'?

时间:2013-11-04 10:52:29

标签: c# object types casting type-conversion

我有一个枚举:

public enum MyEnum
{
    EnumValue1,
    EnumValue2,
}

假设我有一个我想检查作为MyEnum对象的对象,我在第一行遇到编译时错误:

var myEnumValue = enumObject as MyEnum;

if(myEnumValue != null)
{
 ...
}

但我可以做到以下几点:

var myEnumValue = (MyEnum)enumObject;

(但这可能引发异常)

所以我必须使用:

if(enumObject is MyEnum)
{
 //and then assign enumObject to a MyEnum object
}

代替。

问题

为什么在这里不允许使用as但是投射或使用is

2 个答案:

答案 0 :(得分:7)

您不能将as与任何值类型一起使用(nullable types除外)。

原因是如果无法转换对象,as关键字将返回null,但值类型不能为null

答案 1 :(得分:1)

枚举是值类型,不能为null。 as需要Nullable类型才能返回。

但是,如果要安全地转换值类型,则可以显式使用可空,并在as返回null时定义默认值:

var myEnumValue = enumObject as MyEnum? ?? MyEnum.EnumValue1;