関連するプライベートフィールドを実際に設定して他のいくつかのことを行う前に、値が変更されたかどうかを確認する複合コントロールのプロパティがあります。
ただし、ステートメントを評価していないようです。
プロパティのコードは次のとおりです。
public T SearchCriteria
{
get
{
return mySearchCriteria;
}
set
{
if (value != mySearchCriteria)
{
mySearchCriteria = value;
EnsureChildControls();
SearchGridParser parser = SearchGridParserFactory.GetParser(this.Type);
parser.SetSearchPanelControls<T>(this.mySearchCriteria, ref mySearchParametersPanel);
GridView.PageIndex = 0;
}
}
}
コードをステップ実行しましたが、「value!= mySearchCriteria」に到達するたびに、falseと評価され、ifステートメント内のコードをスキップします。実際、「value == mySearchCriteria」に変更しても、これは実行されます。評価方法に関係なく、完全にスキップすると!
なに?
チェックの引数の順序を変更し、object.Equals()を使用してみましたが、これらの変更のいずれも違いはありません。
Equals、!=、==およびGetHashCodeをオーバーライドしました。
コード内には、これらのオブジェクトタイプに「==」と「!=」を問題なく使用している場所が他にもあるので、オーバーライドが正しく機能していることがわかります。
問題は、これがオーバーライドされたメソッドにヒットすることさえないということです。"=="、 "!="、 "Equals"、 "GetHashCode"にブレークを入れましたが、 "value!= mySearchCriteria"ステートメントが評価されているときに、これらはいずれも呼び出されていません。
それはそれがそれを評価することを完全にスキップするようなものです。