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

Dan*_*nov 67 .net c# casting

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;
Run Code Online (Sandbox Code Playgroud)

有没有类似的东西可以做到安全地将对象转换为值类型而没有InvalidCastExceptionif的可能性,无论出于何种原因,该值不是布尔值?

Jon*_*eet 117

有两种选择......性能略有惊人:

令人惊讶的是,第二种形式表现比第一种表现差得多.

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

if (rawValue is bool value)
{
    // Use value here
}
Run Code Online (Sandbox Code Playgroud)

请注意,valueif语句之后,您仍然在范围内(但未明确分配).


SLa*_*aks 16

像这样:

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

与引用类型不同,没有快速的方法可以在没有两个强制转换的情况下尝试强制转换为值类型.(或者一个陷阱,哪个会更糟)


小智 9

使用 C# 9,您还可以简化为:

if(rawValue is true)
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)


Web*_*euw 7

bool value;
if(rawValue is bool)
  value = (bool)rawValue;
else {
  // something is not right...
Run Code Online (Sandbox Code Playgroud)


Jam*_*Ide 5

如果 rawValue 不能转换为 bool,你还没有定义你想要发生的事情。常见的选择是返回 false、null 或抛出异常。rawValue 的字符串表示也有可能转换为 bool,例如 Yes/No、True/False、1/0 等。

我会使用 bool.TryParse 进行转换。如果 rawValue 是 bool 或其字符串值是“True”或“False”,这将成功。

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