C#需要可为空的显式强制转换

C#需要可为空的显式强制转换,c#,C#,为什么编译器不能找出正确的操作数始终为false,并要求我将其强制转换为bool?既然您要赋值给bool,那么正确的操作数就是可为null的_成功。这不能隐式转换为bool,这就是为什么需要转换 如果删除此分配,则它将正常工作: private bool? _success; public bool Success { get { return _success ?? (_success = false);

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

既然您要赋值给
bool,那么正确的操作数就是
可为null的
_成功
。这不能隐式转换为bool,这就是为什么需要转换

如果删除此分配,则它将正常工作:

    private bool? _success;
    public bool Success
    {
        get
        {
            return _success ?? (_success = false);
        }
    }
这是因为“false”已经是一个
bool


但是,在将当前代码的值指定为
false
后,将返回
\u success
由于_success
是一个
bool?
,因此右侧操作数返回
bool?
,而不是
bool
,通常使用
GetValueOrDefault()编写:


第二个不会编译-它有相同的问题。第一种方法有效,但逻辑不同(因为它不再将
\u success
分配给
false
。(不过,我同意这是一种更常见的用法…)请注意,如果您从未直接阅读<代码>成功> /COD>,您可能希望仅考虑Auto属性用于<代码>成功< /代码>,并删除<代码>成功> <代码>(附有代码>私有集合).
bool
默认为
false
。当然,只有在没有私有实现细节赋予
\u success
null
意义时,这才是正确的。
return _success ?? false;
private bool? _success;

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