如何在C#中安全地将System.Object强制转换为`bool`?


74

我正在bool从(非通用,异构)集合中提取一个值。

as运算符只能与引用类型一起使用,因此无法as尝试使用以下方法进行安全广播bool

// This does not work: "The as operator must be used with a reference type ('bool' is a value type)"
object rawValue = map.GetValue(key);
bool value = rawValue as bool;

是否可以执行类似的操作来将对象安全地转换为值类型InvalidCastException,而无论出于何种原因,如果该值不是布尔值,都不会发生?

Answers:


136

有两种选择……性能有些令人惊讶:

  • 冗余检查:

    if (rawValue is bool)
    {
        bool x = (bool) rawValue;
        ...
    }
    
  • 使用可为空的类型:

    bool? x = rawValue as bool?;
    if (x != null)
    {
        ... // use x.Value
    }
    

令人惊讶的是,第二种形式性能比第一种形式差很多

在C#7中,您可以为此使用模式匹配:

if (rawValue is bool value)
{
    // Use value here
}

请注意,您仍然value会在if语句之后进入范围(但未明确分配)的范围。


18

像这样:

if (rawValue is bool) {
    bool value = (bool)rawValue;
    //Do something
} else {
    //It's not a bool
}

与引用类型不同,没有快速的方法可以尝试在没有两次强制转换的情况下强制转换为值类型。(或捕获块,这会更糟)


1
@SLaks:有关使用两个强制类型转换的替代方法,请参见mine和kalusbyskov的答案。并不是真的有帮助。
乔恩·斯基特

8
bool value;
if(rawValue is bool)
  value = (bool)rawValue;
else {
  // something is not right...

5

如果rawValue不能转换为bool,则您尚未定义要发生的事情。常见的选择是返回false,null或引发异常。还可能将rawValue的字符串表示形式转换为布尔值,例如Yes / No,True / False,1/0等。

我将使用bool.TryParse进行转换。如果rawValue是布尔值或其字符串值为“ True”或“ False”,则此操作将成功。

bool result;
if (!bool.TryParse(rawValue as string, out result))
{
    // you need to decide what to do in this case
}



0

我在处理对象之前使用了此检查

if(myCrazyObject.GetType().Equals(typeof(bool)))
{
   //do smt with it
}

0

如果目标是有真正的只有原始对象是布尔“”,那么一行代码(rawValue as bool?)?? false就可以了:

object rawValue=null
(rawValue as bool?)?? false
false
rawValue="some string"
(rawValue as bool?)?? false
false
rawValue=true
(rawValue as bool?)?? false
true
rawValue="true"
(rawValue as bool?)?? false
false
rawValue=false
(rawValue as bool?)?? false
false
rawValue=""
(rawValue as bool?)?? false
false
rawValue=1
(rawValue as bool?)?? false
false
rawValue=new Dictionary<string,string>()
(rawValue as bool?)?? false
false`

-1

如果适合,您也可以简单地执行以下操作:

if(rawValue is true)
{
    //do stuff
}

-3

您也可以尝试Convert.ToBoolean(rowValue);


1
如果类型不能转换为布尔值,这将引发异常,并且如果可以的话,它将尝试将非布尔值转换为布尔值,这不是需求状态应该发生的情况。
2014年

哎呀。我在这里没有注意。谢谢!
user3934664 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.