【问题标题】:C# : Implicit conversion between '<null>' and 'bool'C#:'<null>' 和 'bool' 之间的隐式转换
【发布时间】:2012-10-07 12:10:52
【问题描述】:

当我尝试将 object 转换为 bool 时收到一条奇怪的错误消息,这是我的代码:

public partial class ModifierAuteur : DevExpress.XtraEditors.XtraForm
{
    public ModifierAuteur(object getKeyDecesCheckBox)
    {
         decesCheckBox.Checked = getKeyDecesCheckBox == null ? null : (bool)getKeyDecesCheckBox;
    }
}

这是错误信息:

无法确定条件表达式的类型,因为存在 &lt;null&gt;bool 之间没有隐式转换

【问题讨论】:

    标签: c#


    【解决方案1】:

    假设赋值是可能的,你需要转换成可以为空的bool,像这样:

    decesCheckBox.Checked = getKeyDecesCheckBox == null ? null : (bool?)((bool)getKeyDecesCheckBox);
    

    bool 的内部转换将值拆箱,bool? 的外部转换使其与条件表达式的null 兼容。

    如果赋值左侧不允许nulls,则需要确定getKeyDecesCheckBoxnull 时要设置的值。通常是false:

     decesCheckBox.Checked = getKeyDecesCheckBox == null ? false : (bool)getKeyDecesCheckBox;
    

    【讨论】:

    • 恐怕不行,这是错误信息:Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)
    • @user1726655 啊,但是你的左侧不允许nulls,你需要将null更改为false(或者true,如果发送null表示必须检查项目,尽管我对此表示怀疑)。我对答案进行了编辑,请看一下。
    【解决方案2】:

    假设 Checked 属性是可为空的 bool 类型,我可能会执行以下操作:

    decesCheckBox.Checked = (getKeyDecesCheckBox == null ? (bool?)null : (bool?)getKeyDecesCheckBox);
    

    如果它需要一个布尔值(不可为空),您可以使用以下方法轻松地将 null 转换为 false:

    decesCheckBox.Checked = (getKeyDecesCheckBox == null ? (bool?)null : (bool?)getKeyDecesCheckBox).GetValueOrDefault();
    

    【讨论】:

      【解决方案3】:

      decesCheckBox.Checked 的类型为 bool。因此,您必须提供 falsetrue

      【讨论】:

      • 对于投反对票的人,请参阅接受答案的 cmets
      【解决方案4】:

      你的'? :' 运算符有两种可能的不兼容返回类型:如果对象为 null,则返回值 null,可以将其强制转换为任何可为 null 的类型。如果对象不为 null,则其返回类型为 bool。

      我不知道'Checked'是什么类型,但我怀疑它的类型是'bool'。

      这里的问题是你不能将 null 转换为 'bool' 类型,因此你必须决定在对象为 null 的情况下你希望它是什么类型。如果你想让它是假的,你可以把语句写成:

      decesCheckBox.Checked = (getKeyDecesCheckBox as bool) ?? false;
      

      ??运算符在对象为空或无法转换为布尔值的情况下分配值'false'。

      【讨论】:

      • 那行不通。 as 运算符不能与结构类型一起使用,而 bool 是。
      猜你喜欢
      • 2023-03-17
      • 2013-09-01
      • 2010-12-12
      • 2013-12-22
      • 2015-07-14
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多