2017-01-18 6 views
0

下の行は、(ウォッチ、クイックウォッチとイミディエイトウィンドウで)デバッグウィンドウでは動作しません。これらのウィンドウにSystem.NullReferenceExceptionがスローされます。私は2015年の更新3.なぜ? rowIndexに基づいてIEnumerableのFirstOrDefault検索を行うコードの

sheetdata.Descendants<Row>().FirstOrDefault(p => p.RowIndex.Value == 2U) 

をVisual Studioを使用しています。しかし、私はそれはそれはこれらのデバッグウィンドウで働く同じ検索を一覧表示して行うように変換するとき。この不一致はなぜですか?

sheetdata.Descendants<Row>().ToList().FirstOrDefault(p => p.RowIndex.Value == 2U) 

この矛盾は、コードを実行するときにはありません。これらのデバッグウィンドウでコードをデバッグしようとすると、この矛盾がわかります。

enter image description here

+5

あなたがすべてで見ているものを説明していません「は動作しません」。明確にして、[mcve]を提供してください。 –

+5

'Convert.ToUInt32(2))' Jeez。 '2u' – Will

+0

これで問題は解決しません。私は変換を避けることによって質問を更新しました。 –

答えて

3

私は彼が(SQL用QueryProviderなど)、独自の言語にそれを翻訳する必要が原因のOpenXmlのQueryProviderは、Convert.ToUInt32(2)の取り扱いに問題があると思います。

述部の変換を避けて、それらを前もって行うようにしてください。すべてのQueryProviderがすべての機能をサポートしているわけではなく、例外をスローする可能性があります(ほとんどNotSupportedException)。それはあなたのシートからすべての値を読み、最初に一致する値を検索します原因

uint value = Convert.ToUInt32(2); 
sheetdata.Descendants<Row>().FirstOrDefault(p => p.RowIndex.Value == value) 

コール.ToList()は、メモリでこれを実行します。

+1

'uint'タイプの値2を' 2u'だけ書くことができます。それを直接使用します。 C#コンパイラとLinqプロバイダは、 '2u'の意味を理解していないメソッド呼び出し' Convert.ToUInt32(2) 'と比較して、' 2u'の方がはるかに優れていることが分かります。さらに、 '=='のオペランドの文脈では、C#コンパイラが適切な型を選択するのに十分にスマートなので、 '2'を使うことができます。しかし、「2u」は人間の読者にとってより正確です。 –

+0

ご返信ありがとうございます。しかし、これは問題を解決しません。私は変換を避けることによって質問を更新しました。 –

関連する問題