【问题标题】:Convert Char To Boolean将字符转换为布尔值
【发布时间】:2017-10-26 19:10:20
【问题描述】:

在 C++ 中假定为假,而所有其他值都为真。我的印象是,在 C# 中这个概念是相同的。

我正在尝试将 char 转换为 bool。

char c = (char)0;
Convert.ToBoolean(c).Dump();

似乎无论我尝试转换什么字符,我总是得到一个错误

从 'Char' 到 'Boolean' 的无效转换

我知道如果我编写自己的自定义函数可以解决这个问题,但我想了解的是。

这个方法的目的是什么,什么Char值转换成Bool?

【问题讨论】:

  • 您可以将其用作字节或 Int32 转为布尔值。但是使用 char 或使用 string 你不能这样做。对于 byte 和 int,只有 0 为 false ,除 0 以外的所有值都为 true 。您也可以将此转换用于 double 或 float 类型。

标签: c# casting


【解决方案1】:

这应该可行:

Convert.ToBoolean(Convert.ToInt32(charVar.ToString()))

【讨论】:

    【解决方案2】:

    你说:

    我的印象是,在 C# 中这个概念是相同的。

    你错了。它不是。这两种语言的行为方式不同,您根本无法将Char 转换为Boolean

    文档清楚地表明该方法总是失败:

    调用这个方法总是抛出InvalidCastException

    还有……

    返回值

    输入:System.Boolean

    不支持此转换。没有返回值。

    Char.ToBoolean() 的来源证明:

    [__DynamicallyInvokable]
    bool IConvertible.ToBoolean(IFormatProvider provider)
    {
        object[] values = new object[] { "Char", "Boolean" };
        throw new InvalidCastException(Environment.GetResourceString("InvalidCast_FromTo", values));
    }
    

    由于Char 类继承自IConvertible,因此需要提供重载。但由于无法进行这种转换,所以总是返回异常。

    【讨论】:

      【解决方案3】:

      只是为了展示如何使用 unsafe 关键字(类似于 c++)来完成。不要用这个..

      char c = (char)0;
      unsafe{
          bool b = *((bool *)&c);
      }
      

      【讨论】:

      • 除了写c == 0之外,你为什么还要这样做?
      • @Servy 只是为了展示如何将一种类型转换为另一种类型不安全
      • 但问题没有问如何不安全地将char 转换为bool。问题是他们已经知道如何编写自己的代码来转换值;他们在询问Convert.ToBoolean 的行为。
      【解决方案4】:

      这个方法的目的是什么...?

      来自.NET 2.0 documentation

      此方法保留供将来使用。

      也许他们正在考虑按照 C++ 的方式实现它,但最终决定不这样做。

      编辑 - IConvertible 不是原因

      char.ToBoolean() 方法似乎有些混乱。

      ((IConvertible)someChar).ToBoolean(...);
      

      是与Convert.ToBoolean 不同的问题。 (为什么要先进行显式转换 - 请参阅 here。)当 char 变为 IConvertible 时,前一个必须实现。后者可能根本就没有被创建,所以为什么该方法 (Convert.ToBoolean) 存在的问题似乎只是为了向后兼容 + 初衷。

      (如果是我误解了这一点 - 当然,请告诉我。)

      【讨论】:

        猜你喜欢
        • 2018-09-07
        • 2019-07-24
        • 1970-01-01
        • 2013-01-24
        • 2012-03-10
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多