在C#中查询Nullable bool

时间:2012-02-07 15:35:46

标签: c# resharper nullable

我遇到了以下代码的一个奇怪问题。虽然Resharper突出显示代码段(autorefresh == null),但通知我表达始终为假

,但它编译得很好
bool? autorefresh = Properties.Settings.Default.autorefresh;
autorefresh = (autorefresh == null) ? false : autorefresh;
Enabled = (bool)autorefresh;

任何想法如何更好地解决这个问题?

编辑07/02/2012 16:52

Properties.Settings.Default.autorefresh

上面是bool,而不是string

7 个答案:

答案 0 :(得分:6)

我认为你想要的是:

Enabled = Properties.Settings.Default.autorefresh ?? false;

根据您的评论,您似乎不必将autorefresh的值分配给Nullable<bool>。在保护数据方面,Settings会返回该类型的默认值(如果该类型无效或缺失(falseboolean))。因此,您的代码应该只是:

Enabled = Properties.Settings.Default.autorefresh;

答案 1 :(得分:3)

理由通过:

bool? autorefresh = Properties.Settings.Default.autorefresh; 
                 // ^^^ this is a non-nullable Boolean

Properties.Settings.Default.autorefresh不可为空,因此它将为真或假。

因此,可空的本地autorefresh也将为true或false,因为它被初始化为true或false的值。

autorefresh = (autorefresh == null) ? false : autorefresh; 
                       // ^^^^ therefore this test will never succeed

因此,这相当于:

autorefresh = autorefresh; 

这显然毫无意义。 (而且,正如其他人所指出的那样,autorefresh ?? false无论如何都是编写此代码的更好方法。)

问题是:为什么你首先要有局部变量?为什么不简单地说:

Enabled = Properties.Settings.Default.autorefresh;

答案 2 :(得分:1)

  bool? autorefresh = Properties.Settings.Default.autorefresh ?? false;

使用可空操作符进行以下比较是安全的

autorefresh == null 

或者你也可以比较

autorefresh == true 

autorefresh == false

答案 3 :(得分:1)

您也可以这样做:

 Enabled = Properties.Settings.Default.autorefresh.GetValueOrDefault(false);

如果可以为空的值可以为您执行此操作,则无需检查空值。

答案 4 :(得分:0)

Nullables有一些有趣的行为。我需要挖掘一下才能找到你看到的确切原因。无论如何,测试可空的正确方法是使用.HasValue方法。

答案 5 :(得分:0)

你可以试试这个:

bool? autorefresh = Properties.Settings.Default.autorefresh;
Enabled = (!autorefresh.HasValue) ? false : autorefresh.Value;

答案 6 :(得分:0)

autorefresh是可空类型,这意味着autorefresh.Value可以为null。 我认为你可以这样做

enable =!autorefresh.HasValue? false:autorefresh.Value;