2017-02-24 22 views
1

私は非常に奇妙な動作をしています。オブジェクトは同時にNULLでなく、nullではないように見え、ステートメントはスキップされます。私はおそらく馬鹿だが、それが私のせいだと私はそれを見ない。私はWindows 7 SP1 OSでVisual Studio 2008を使ってビルドしています。C#:オブジェクトはnullで、nullではありません

public void ReadTrendData(OpcDriver opcDriver) 
    { 
     if (opcDriver != null) 
     { 
      int a = 1; 
     } 

     if (opcDriver == null) 
     { 
      Exception ex = new Exception("Null OPC driver received by ReadTrendData()"); 
      throw ex; 
     } 

opcDriverオブジェクトが正常に作成され、このメソッドに渡されます。私がステップスルーすると、 "int a = 1"ステートメントが実行されます。次に、次のifブロックで、exオブジェクトを作成する上の行を実行せずに "throw ex"文に実行が移ります。したがって、exはnullで、nullを投げるとアクセス違反の例外が発生します。

ここで何が起こっている可能性がありますか?

OpcDriverクラスのいくつかのメンバーは、COMを使用してOPC(OLE for Process Control)プログラムとインターフェイスする、サポートされていない15年前のサンプルライブラリのクラスのインスタンスです。私が考えることができるのは、そのライブラリの腸のどこかにグロテスクが起こっているということだけですが、どうすればこのことが可能か考えられません。

ありがとうございます。

+5

OpcDriverはどこですか? - それはどの演算子にもオーバーロードされていますか? –

+0

私はきれいな、再起動したVS、クリーンビルドルーチンを試したとしますか?また、私はブレークポイントを設定し、ウォッチウィンドウが 'opcDriver'と考えるものを見ています。 –

+1

正しい.pdbとソースコードがありますか? –

答えて

0

新しいビジュアルスタジオビルドを試してください。私は2008年と2012年のバージョンでほぼ同じ問題を抱えています。ビジュアルスタジオのコンパイル時のバグです。ビルドオプションをチェックする必要があります。「リリース」モードを選択した場合は、デバッグを再度確認してからやり直してください。

0

要約すると、問題のルートは誤った演算子のオーバーロード(==および/または!=)です。テスト if (Object.ReferenceEquals(opcDriver, null)) 期待どおりに動作します。

関連する問題