1

次のboolような変数があります。

bool myBool = true;

書くif (myBool == null)と、次の警告が表示されます。

タイプ「bool」の値がタイプ「bool?」の「null」と等しくなることはないため、式の結果は常に「false」になります。

null 非許容変数が null かどうかをチェックする意味がないため、これは明らかです。Visual Studio はそれを認識し、警告としてマークします。

私がstring知っているように、これはデフォルトでnull可能です。

stringVisual Studio に気付かれずに、null 条件演算子をハードコーディングされた演算子に適用できるのはなぜですか? 私はこのようなことを考えています:

"This is a string"?.AnyStringMethod();

stringVisual Studio は、これがまったく null ではないことに気付くべきではありませんか?

4

5 に答える 5

9

警告は、正しく見えるが実際には間違っているコードに対するものです。

あなたのコードは間違っているように見えますが、とにかく正しいことをします。

したがって、警告はありません。

于 2016-06-28T12:58:07.070 に答える
8

Visual Studio は、オペレーターが操作している型から外れる必要があります。

を作成するboolと、その型を に変更するまで、その型によって null になることはありませんbool?

ただし、ハードコードされた文字列では、引用符内にテキストが含まれていても、そこに留まる保証はありません。作成される「変数」は (プレーンな文字列であっても) 型のままであり、型を変更せずに を割り当てるstringことができます。null

あなたが探しているのは、彼らが作成しているすべての変数の値を検査することです。もしそうなら、このようなこともチェックしてみませんか?

var i = 0;

if (i > 2) // This will always be false!

アップデート

コメントでInBetweenが述べたように、ここにも少し見落としがあります。そのような文字列が"Some string"変数に割り当てられていないことは、機能的には と同等const string s = "Some string";です。そのように宣言した場合、コード インスペクターは、次のような比較を実行するかどうかを検出します。

const string s = "Some String";
if (s == null) // This will give a warning that this can't happen

const処理される方法とプレーンな静的文字列が処理される方法の違いは、異なる時間に異なる部分に取り組んでいる異なる開発チームに起因すると考えられます。繰り返しますが、これは大きな問題を引き起こさないエッジケースであり、それに取り組んでいる人は誰も考えていない可能性が高いという警告を受けません。

于 2016-06-28T12:39:40.713 に答える
1

誰も考えなかったから?あなたのコードはあまりにも無意味なので、おそらく誰も製品コードで使用されるとは予想していませんでした。このシナリオは、C# 設計委員会で一度も取り上げられなかったと確信していますが、Eric Lippert のような誰かがこの問題にさらに光を当てるまで、私はそれを一粒の塩で受け止めます.

C# のシャープは、すべての潜在的な機能を備えた状態で生まれてくるわけではなく、誰かがそれを削除することを決定します。コンパイラが特定の警告を出すためには、誰かがそれについて考え、実装し、テストし、文書化する必要があります。

の場合myBool == null、警告は正当化されます。これは、製品コードに含まれる可能性のあるもっともらしいエラーであり、明らかにプログラムのロジックのバグであるためです。2 番目のシナリオは、実際に運用されたとしてもまったく無害であるため、この警告はあまり意味がありません。

于 2016-06-28T12:40:12.990 に答える
0

文字列リテラルは、文字列オブジェクトとは少し異なります。文字列リテラルは基本的に定数のようなものであり、不変であり、null になることはないと思います。

文字列リテラルを変数に割り当てると、メモリ位置に文字列への参照が作成されます。その参照は null にすることができます。文字列変数を別の文字列と連結して元の文字列変数に格納しようとすると、メモリ内の元の文字列が破棄され、連結された文字列である新しい文字列が作成されます。これは、文字列が常に不変であるためです。

于 2016-06-28T12:47:27.467 に答える
0

bool は値型で、string は参照型であるため

値の型を null にすることはできませんが、参照型は Default によって自動的に null になります

Visual Studio が認識しない理由は、実際には重要ではないためです..青が緑よりも色に近いかどうかを尋ねるようなものです.

于 2016-06-28T12:40:40.680 に答える