Запрашиваемый Nullable bool в C # - PullRequest
       6

Запрашиваемый Nullable bool в C #

4 голосов
/ 07 февраля 2012

Я столкнулся с любопытной проблемой со следующим кодом.Он прекрасно компилируется, хотя 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 ]

6 голосов
/ 07 февраля 2012

Я думаю, что вы хотите:

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

В свете ваших комментариев кажется, что вы излишне присваивали значение autorefresh для Nullable<bool>.С точки зрения защиты данных, Settings вернет вам значение по умолчанию для этого типа, если оно недопустимо или отсутствует (которое будет false для boolean).Поэтому ваш код должен быть просто:

Enabled = Properties.Settings.Default.autorefresh;
3 голосов
/ 07 февраля 2012

Объясните это через:

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

Properties.Settings.Default.autorefresh не может быть обнулено, поэтому оно будет либо истинным, либо ложным.

Следовательно, обнуляемый локальный autorefresh также будет либоистина или ложь, поскольку оно инициализируется значением, которое является истинным или ложным.

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

Следовательно, это эквивалентно:

autorefresh = autorefresh; 

, что, очевидно, бессмысленно.(И, как уже указывали другие, autorefresh ?? false - лучший способ написать этот код в любом случае.)

Вопрос в том, почему у вас локальная переменная вообще?Почему бы просто не сказать:

Enabled = Properties.Settings.Default.autorefresh;

?

1 голос
/ 07 февраля 2012

Вы также можете сделать это:

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

Нет необходимости проверять наличие нулей, если значение, которое можно обнулять, может сделать это для вас.

1 голос
/ 07 февраля 2012
  bool? autorefresh = Properties.Settings.Default.autorefresh ?? false;

Можно сделать следующие сравнения с обнуляемыми операторами

autorefresh == null 

или вы также можете сравнить

autorefresh == true 

или

autorefresh == false
0 голосов
/ 07 февраля 2012

autorefresh имеет тип null, что означает, что autorefresh.Value может иметь значение null.Я думаю, что вы можете сделать как это

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

0 голосов
/ 07 февраля 2012

Вы можете попробовать это:

bool? autorefresh = Properties.Settings.Default.autorefresh;
Enabled = (!autorefresh.HasValue) ? false : autorefresh.Value;
0 голосов
/ 07 февраля 2012

Nullables имеют интересное поведение.Мне нужно немного покопаться, чтобы узнать точные причины того, что вы видите.Независимо от того, правильный способ проверить обнуляемый состоит в том, чтобы использовать метод .HasValue.

...