当我知道它不是null时,这是必需的吗?

时间:2009-12-18 16:02:27

标签: c# casting null

我有以下内容:

MyEnum? maybeValue = GetValueOrNull();

if (null != maybeValue)
{
    MyEnum value = (MyEnum)maybeValue;
}

我想知道的是,在(MyEnum)类型的实例上是否需要显式MyEnum?强制转换。这似乎是一个简单的问题,我只是感到偏执,如果我在MyEnum value = maybeValue语句中做if,可能会出现运行时错误。

5 个答案:

答案 0 :(得分:8)

对于可以为空的类型,您可以执行

if (maybeValue.HasValue)
{
    MyEnum value = maybeValue.Value;
}

答案 1 :(得分:6)

由于您使用的是可空类型,请尝试使用

if(maybeValue.HasValue)
{
    MyEnum value = maybeValue.Value;  // no cast needed! Yay!
}

答案 2 :(得分:4)

许多答案都指出使用Value属性可以避免强制转换。这是正确的,它回答了问题:

  

是在“MyEnum”类型的实例上需要显式(MyEnum)强制转换吗? ?

但是,我们还没有解决其他问题:

  

如果我只是在if语句中执行了MyEnum value = maybeValue,我感到有点偏执,可能会有一些运行时错误。

好吧,首先,您不能简单地为其基础类型的变量分配可空值。你必须做些事情才能明确地进行转换。

但是,如果你按照你描述的方式这样做 - 检查是否有值 - 那么这是安全的。 (当然,前提是没有人在调用HasValue和获取值之间改变包含可空值的变量。)

如果您使用ILDASM或其他工具来检查生成的代码,您将发现将可为空的值转换为其基础类型只是生成为对Value属性的访问;使用强制转换操作符或访问Value属性是一个差异,实际上没有任何区别。如果HasValue为false,则将抛出Value属性访问器。

使用您认为更好的语法。我个人可能会在演员语法中选择“Value”语法,因为我觉得更好地说“如果它有一个值,给它值”,“如果它有一个值,将它转换为它的底层类型”。 / p>

答案 3 :(得分:3)

我相信当您将变量定义为可空类型时,它会添加.HasValue属性和.Value属性。你应该能够使用它们来避免任何演员。

您可以像这样重写代码

MyEnum? maybeValue = GetValueOrNull();

if (maybeValue.HasValue == true)
{
    MyEnum value = maybeValue.Value;
}

答案 4 :(得分:3)

另一种选择是将你的枚举设置为默认(0)值,然后你就可以执行以下操作:

MyEnum value = GetValueOrNull().GetValueOrDefault();

但是,这需要您的代码知道默认值的含义,并且可能与其他枚举类型的处理方式不同。