【问题标题】:Why can't I use 'as' when checking if a variable is an enum value?为什么在检查变量是否为枚举值时不能使用“as”?
【发布时间】:2013-11-04 10:52:29
【问题描述】:

我有一个枚举:

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

【问题讨论】:

  • as 表示:如果可能,请强制转换,否则返回nullnull 不是枚举的有效值。不过你可以使用MyEnum?

标签: c# object types casting type-conversion


【解决方案1】:

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

原因是as关键字返回null如果对象不能被强制转换,但是值类型不能是null

【讨论】:

  • "您不能将 as 用于任何值类型。" - 实际上,您可以将as正好一半 可用的值类型一起使用。考虑一下...(如果您需要提示,请告诉我)
  • @MarcGravell 是的,我在发表评论几秒钟后就明白了你的意思。
【解决方案2】:

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

然而,如果你想安全地转换一个值类型,你可以显式地使用一个可为空的,并在as返回空时定义一个默认值:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多