32

私は警告を与える次のコードを持っています

意図しない参照比較の可能性。値の比較を行うには、左側を「string」型にキャストします。

if (lblStatus.Content == "ACTIVE")
{
  //Do stuff
}
else
{
  //Do other Stuff
}

警告は、lblStatus.Content必ずしも文字列型であるとは限らないためだと思いますか?

次のそれぞれを使用して修正しようとしましたが、それでも警告が表示されます

if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")
if (lblStatus.Content === "ACTIVE")

それでも警告が表示される理由と、これに対処するための最も実用的な方法を誰かが説明してくれませんか?

4

3 に答える 3

66

のコンパイル時の型が でlblStatus.Contentあるため、警告が表示されますobject。したがって、演算子のオーバーロードは、==(object, object)単なる参照同一性比較であるオーバーロードを選択します。これは、値の実行時の型とは関係ありません。

ただし、オプションの最初または2番目で警告が修正されているはずです。

if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")

lblStatus.Contentが nullの場合、これらの最初のものは例外をスローすることに注意してください。私は第二形態の方が好きです。

その時点でまだ警告が表示されていると思われる場合は、再構築していないか、ビルドにまだ「ダーティ」なものがあると思われます。完全な再構築により、警告は絶対に削除されます。

于 2012-09-04T12:45:46.863 に答える
1

私は次のように方法を固執することを好みstring.Equals(string,string,StringComparison)ます:

    string contentStr = (lblStatus.Content ?? string.Empty).ToString();
    if (string.Equals("ACTIVE", contentStr, StringComparison.OrdinalIgnoreCase))
    { 
        // stuff
    } 

+それが何をするかを明示的に述べているので+あなたが言及した警告を与えません。

于 2012-09-04T12:51:56.690 に答える
-3

これを使用してコードを修正した後、プロジェクトを再構築します。

if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")
if (lblStatus.Content === "ACTIVE")
于 2014-06-04T01:55:42.257 に答える