2

遅延評価がlinqMax演算子にどのように関連しているかを理解するのに少し問題があります。

これは私のコードです:

        var someList = new List<someType>
        {
            new someType { decimalValue = 32 }
        };

line1: var valA = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;

line2: var valB = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;

line3: var valC = valB;

コードをステップスルーすると、次の動作が表示されます。

1行目が実行された後、valA = 0, valB = 0, valC = 0

2行目が実行された後、valA = 32, valB = 0, valC = 0

3行目が実行された後、valA = 32, valB = 32, valC = 32

割り当てられた後にのみ値を表示するのはなぜですか?また、割り当てられvalAた後にのみ値を表示するのはなぜですか?valBvalBvalC

以下は私のデバッガーのスクリーンショットです。私のIDEには非標準的なものがあるに違いないと思います。

IDEイメージ
(出典:toastermagic.co.uk

4

2 に答える 2

1

Maxオペレーターはすぐに実行され、延期されることはありません。表示されているのは、デバッガーの通常の動作です。行が強調表示されている場合は、「この行を実行した」ではなく、「この行を実行しようとしています」という意味です。特定のコード行の結果を表示するには、常に「次の」行にいる必要があります。

あなたはこれを説明したようです。すべての変更が表示されるという事実(これはLINQ固有のものではありません)は、おそらくソースコードと実行可能ファイルが少し同期していないことを意味します。ソリューションをクリーンで再構築する必要があります。そうすれば、すべてが正常になります。ビルドで適切に取得されなかったソースコードに小さな変更を加えたため、実行可能ファイルとソースコードの行番号がそれぞれ1つずつずれていると思います。

何かが本当に、本当に間違っている場合は、コードを新しいプロジェクトに完全に移動して(コードベースが十分に小さい場合)、この問題の原因となっている破損または破損したファイル/設定を取り除くことができます。

于 2012-07-18T14:36:11.027 に答える
0

複製できません:

    static void Main(string[] args)
    {
        var data = (from n in Enumerable.Range(0, 10)
                    select new { value = (decimal)n })
                   .ToList();

        var valA = data.Any() ? data.Max(s => s.value) : 0.0M;
        Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, 0, 0);

        var valB = data.Any() ? data.Max(s => s.value) : 0.0M;
        Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, valB, 0);

        var valC = valB;
        Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, valB, valC);

        Console.ReadLine();
    }

期待どおりに動作します。

デバッガーの誤読のようです。

于 2012-07-18T14:40:46.143 に答える