0

簡単なC#ステートメントがあります。

var code = container.thing.result.decode ?? "Unknown";

これにより、「オブジェクトのインスタンスに設定されていないオブジェクト参照」がスローされます。データベース値がnullの場合の例外。これは(これまでのところ)null以外の値で完全に機能します。もっと明確にして、三項演算子で行を書き直してみました。

var outcome = container.thing.result.decode == null ? "Unknown" : container.thing.result.decode;

そして、同じ例外を除いて同じ結果が得られます(そして、ReSharperは私をはるかに単純な??ステートメントに戻します)。

私もそれを読んだ?? 演算子はnull許容型でのみ機能します。私が使用しているフィールドはnull許容型ではなく、nvarchar(100)であり、ルックアップテーブルへの外部キーでもあります。上で述べたように、ステートメントは有効なnull以外の値で機能します。

アプリケーションのORMにはCODE値もあり、CODEとDECODEのペアを作成します。これは、ルックアップテーブルに適切にマップされているように見えます。

しかし、null値を処理する方法がわかりません。

ありがとうございました!

編集:迅速な対応ありがとうございます!投稿してからわずか数分で、どこが混乱しているかがわかりました。質問を書くことは私が問題を描写するのを助けたと思います。ステートメントを変更して、ルックアップテーブルを参照する実際のフィールドがnullかどうかを確認しました。

var outcome = container.thing.database_code_field == null ? "Unknown" : container.thing.result.Decode;

これは私が欲しいもののように見えます。ありがとうございました!

4

3 に答える 3

5

次のいずれかがnullの場合、例外が発生します。

  • container
  • container.thing
  • container.thing.result

あなたの状況でこれらの値のどれがnullであるか、またはnullが有効な値であるかどうかを判断することはできません。それを解決してから、null値を与えるものを修正するか、その場合を処理するコードを作成する必要があります。

于 2012-04-12T18:34:58.507 に答える
4

メンバー階層全体をステップスルーする必要があります。

たとえば、containerがnullの場合、にアクセスできませんcontainer.thing。また、container.thingがnullの場合はcontainer.thing.results、などにアクセスできません。

最後のメンバーがnullの場合を単純に捉えるだけでは不十分です。

于 2012-04-12T18:36:24.063 に答える
0

問題はcontainer、、、thingまたはresultがnullであり、ではないことdecodeです。decodenullの場合、演算子??は文字列を適切に設定します。

??null許容値とnull以外の値を取り替える関数です。演算子の左側全体を??評価して、その関数に渡す必要があります。前述の変数の1つがnullの場合、それはそれほど遠くにはなりません。

于 2012-04-12T18:35:22.830 に答える