我正在从(非泛型的、异构的)集合中提取一个bool值.

as运算符只能与参考类型一起使用,因此无法使用astry 安全转换为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

推荐答案

有两个 Select .略显出人意料的表现:

  • 冗余判断:

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

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

令人惊讶的是,这performance of the second form is much worse than the first人.

在C#7中,您可以使用模式匹配来实现这一点:

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

请注意,在if语句之后,范围仍然为value(但没有明确指定).

.net相关问答推荐

在`MAUI`应用中使用Android`MediaPlayer`的`prepare`方法只在发布模式下和在物理设备上崩溃

为什么这个同步运行的异步睡眠会挂起?

无法通过构建目标访问 dotnet 的环境变量

当 Func 委托需要接口作为参数时,它是如何工作的?

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

双精度的 C++ 和 C# 十六进制值之间的差异

在 C# 中将字符串转换为 colored颜色

是否有任何 x 次的 for 循环的更短/更简单的版本?

AutoMapper 的替代品

获取当前方法的名称

ASP.NET Core 等效于 ASP.NET MVC 5 的 HttpException

是否可以更改 Winforms 组合框以禁用输入?

如何使用 C# 创建自签名证书?

Dispatcher.CurrentDispatcher 与 Application.Current.Dispatcher

什么是 .NET 应用程序域?

如何使用 DateTime 指定一天中的最晚时间

使用没有catch块的try-finally块

如何重新启动我的 C# WinForm 应用程序?

程序员应该使用 SSIS,如果是,为什么?

如何在我的机器上找到 fuslogvw.exe?