我想知道对可空bool进行条件检查的最干净和最容易理解的语法是什么。

下面的编码风格是好还是坏?有没有更好/更清楚地表达这种情况的方法?

bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }

特别是if (nullableBool ??假)的部分。我不喜欢if (x.HasValue && x.Value)样式…

(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)


当前回答

如果你无法控制条件的一部分是否检查一个空值,你总是可以尝试以下方法:

if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

我知道在if语句中放入三元并不是一种纯粹的方法,但它确实清晰地解决了这个问题。

这当然是手动的GetValueOrDefault(false)

其他回答

实际上我认为(nullableBool ??False)是一个合理的选项,特别是当你试图在linq中计算一个可为空的bool值时。

例如:

array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)

在我看来更干净,而不是:

array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)

我认为很多人都专注于这个值是可空的,而没有考虑他们真正想要的是什么:)

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null

或者如果你想要更多的选择…

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null

(nullableBool == true)将永远不会返回true如果bool?null:P

使用扩展。

public static class NullableMixin {
    public static bool IsTrue(this System.Nullable<bool> val) {
        return val == true;
    }
    public static bool IsFalse(this System.Nullable<bool> val) {
        return val == false;
    }
    public static bool IsNull(this System.Nullable<bool> val) {
        return val == null;
    }
    public static bool IsNotNull(this System.Nullable<bool> val) {
        return val.HasValue;
    }
}


Nullable<bool> value = null;
if(value.IsTrue()) {
// do something with it
}

如果你想把null值处理为false,那么我会说最简洁的方法是使用null联合运算符(??),正如你所描述的:

if (nullableBool ?? false) { ... }

如果你无法控制条件的一部分是否检查一个空值,你总是可以尝试以下方法:

if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

我知道在if语句中放入三元并不是一种纯粹的方法,但它确实清晰地解决了这个问题。

这当然是手动的GetValueOrDefault(false)