我遇到了以下代码的一个奇怪问题。虽然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
。
答案 0 :(得分:6)
我认为你想要的是:
Enabled = Properties.Settings.Default.autorefresh ?? false;
根据您的评论,您似乎不必将autorefresh
的值分配给Nullable<bool>
。在保护数据方面,Settings
会返回该类型的默认值(如果该类型无效或缺失(false
为boolean
))。因此,您的代码应该只是:
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;