6

3 進数を使用して 10 進数型を割り当てようとしています。それは私のために働いていません。私は夢中になっていますか?

これが私のデバッグのスクリーンショットです。私が足を踏み入れる前に、すべての価値を見ることができます。 ここに画像の説明を入力

そして、ここに足を踏み入れた後、値が表示されます。実行可能なオプションの 1 つでもありません (つまり、1 または 2000)。 ここに画像の説明を入力

私が知らない小数に関する奇妙な制限はありますか? 完全な if/else 論理表現に分割すると、正常に動作します。推測できる唯一のことは、最近 .NET Framework 4.5 をインストールしたということです。

アップデート

ソリューションをクリーンアップし、コメントで推奨されているように、デバッグ モードでコンパイルされたコードで実行していることを確認しました。どちらも何も変わっていないようでした。

すべての単体テストがまだ合格していることに気付いたとき、私は興味を持ち始めました。もう少し調べてみると、もう一度足を踏み入れると (つまり、memberItems.Add をまたぐと)、価格が魔法のように適切な値になることがわかりました。

.Net は、反復子ブロックの yield コマンドに似た、ある種の三項演算子の遅延解決を行いますか? 今まで気が付かなかったのですが、他に何があるかわかりません。誤ってリリース モードでコンパイルされたコードをまだ実行している可能性もあります。自分自身をトリプルチェックした後、私はばかげた間違いを犯しました.

4

2 に答える 2

6

スクリーンショットからコードを診断することは不可能なので、推測にすぎません。

ウォッチ式が示す内容に常に完全に依存できるとは限りません。最初に考えられる障害モードは、最適化されたコードのデバッグです。priceのようなローカル変数は、通常、スタックではなく CPU レジスタに格納されるようにジッター オプティマイザによって最適化されます。ウォッチ式は、CPU レジスタ値ではなく、スタック位置の値を表示します。0 が一般的な結果です。これに対する唯一の本当の防御は、Debug 構成によってビルドされたコードをデバッグすることだけです。

2 番目の障害モードは、ウォッチ式が評価される方法です。CLR は、アタッチされたデバッガーを検出すると、専用スレッドを開始します。その後、デバッガーはこのスレッドを使用してウォッチ式を評価できます。変数にスレッド アフィニティがある場合、これはうまくいかない可能性があります。一般的なケースは、[ThreadStatic] である変数または COM オブジェクトのプロパティです。

于 2012-08-22T15:15:52.770 に答える