我有以下内容:
MyEnum? maybeValue = GetValueOrNull();
if (null != maybeValue)
{
MyEnum value = (MyEnum)maybeValue;
}
我想知道的是,在(MyEnum)
类型的实例上是否需要显式MyEnum?
强制转换。这似乎是一个简单的问题,我只是感到偏执,如果我在MyEnum value = maybeValue
语句中做if
,可能会出现运行时错误。
答案 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();
但是,这需要您的代码知道默认值的含义,并且可能与其他枚举类型的处理方式不同。