需要显式强制转换

本文关键字:转换 | 更新日期: 2023-09-27 18:15:13

    private bool? _success;
    public bool Success
    {
        get
        {
            return _success ?? (_success = false);
        }
    }

为什么编译器不能找出正确的操作数总是假的,并要求我将其强制转换为bool ?

需要显式强制转换

右操作数是Nullable<bool>,因为您正在分配给bool? _success。这不能隐式地强制转换为bool类型,这就是为什么需要强制转换的原因。

如果你删除了赋值,那么它将正常工作:

return _success ?? false;

这可以工作,因为"false"已经是一个bool

然而,你当前的代码在赋值false后返回_successAs _successbool?,右操作数返回的是bool?,而不是bool

您通常会使用GetValueOrDefault():

private bool? _success;
public bool Success
{
    get
    {
        return _success.GetValueOrDefault(false);
    }
}

从c# 8.0及以上版本开始,您可以使用空合并赋值操作符??=,并将其写得最简洁:

private bool? _success;
public bool Success => _success ??= false;

编译器将对整个表达式求值,并考虑表达式的右边匹配所需的bool类型。