2012-02-07 17 views
4

次のコードでは、好奇心が強い問題に遭遇しました。この問題を回避する方法をよりよく私式が常に偽であるC#でNull可能なブールを照会

bool? autorefresh = Properties.Settings.Default.autorefresh; 
autorefresh = (autorefresh == null) ? false : autorefresh; 
Enabled = (bool)autorefresh; 

任意のアイデアを通知Resharperハイライトのコードセグメント(autorefresh == null)、けれどもそれは罰金コンパイル? 2012年7月2日16時52分

Properties.Settings.Default.autorefresh 

上記

編集bool、ないstringです。私はあなたが何をしたいと思います

+8

自動リフレッシュがnullでないブール値ではありませんか? (この場合、nullになることはありません) –

+1

自動リフレッシュはnull可能な型です。つまり、autorefresh.Valueはnullになります。私はあなたがこれ=(!autorefresh.HasValue)を有効にすることができると思いますか? false:autorefresh.Value; –

答えて

6

がある:あなたのコメントを踏まえて

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

、あなたがunneccessarily Nullable<bool>autorefreshの値を代入して表示されます。データを保護する観点から、Settingsは、無効または不足の場合(booleanの場合はfalse)、そのタイプのデフォルト値を返します。したがって、あなたのコードは、単純に次のようになります。

Enabled = Properties.Settings.Default.autorefresh; 
+0

これは不可能です。コンパイラは以下の "左オペランドの '??'演算子は参照型またはnull型でなければなりません " – wonea

+0

@wonea、' autorefresh'は普通の 'bool'です。変数Nullable に変数を代入する理由はありますか? –

+0

@woneaは 'autorefresh'でヌルブルブルですか?そうでなければ、それは問題です。あなたの質問(およびコード)はそれがそうであることを暗示しているようです。しかし、私はちょうどブール値の設定で追加された小さなテストアプリを実行し、それは私に戻って真っ直ぐなブールを与えた。その場合、 'Properties.Settings.Default.autorefresh'の値にできるすべての単純なセットでnull可能なブールを使用する必要はありません – James

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

あなたにも比較することができるNULL可能なオペレータ

autorefresh == null 

かでこれらの以下の比較を行うことが安全である

autorefresh == true 

または

autorefresh == false 
0

nullableにはいくつか興味深い動作があります。私は、あなたが見るものの正確な理由を得るために少し掘り下げなければならないでしょう。それにかかわらず、nullableをテストする正しい方法は、.HasValueメソッドを使用することです。

0

あなたはこれを試みることができる:

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

自動リフレッシュはautorefresh.Valueがnullになることを意味NULL可能タイプです。 このようにすることができると思います。

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

1

また、これを行うことができ張り出す:NULL可能値はあなたのためにそれを行うことができればNULL値をチェックするために

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

必要がありませんが。

3

理由、それを通過:

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

Properties.Settings.Default.autorefreshは、非NULL可能であるので、それは真か偽のどちらかになります。

したがって、NULL可能なローカル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; 

+0

いくつかの議論(私の記事のコメントを参照)の後、ユーザーが値をNullable に割り当てる理由は、設定が欠落しているか無効であることを防ぐためでした。しかし、説明したように、設定ファイルから値を判断できない場合、 'Settings'がタイプのデフォルトを返すので、これは決してありません。おそらく@woneaは 'Settings'と' AppSettings'の間で混乱していると思います。 – James

+0

@eric:もう一度、あなたの洞察力に感謝します。 –

関連する問題