2012-04-12 12 views
0

あるデータベースNULL値を引くではない私は、単純なC#ステートメントがあります「オブジェクトのインスタンスに設定されていないオブジェクト参照」ヌル統合オペレータ "??"外部キー

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

スローデータベースの値がnullの場合は例外です。これは、null以外の値で完全に(これまでのところ)動作します。私はより明確であることしようとした三項演算子を持つ行書き直し:

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

をと私は同じ例外を除いて同じ結果を得る(とReSharperのは非常に簡単??ステートメントに戻って私を案内します)。

私はまた、演算子はnull値の型でのみ動作します。私が扱っているフィールドはnullable型ではなく、nvarchar(100)であり、ルックアップテーブルへの外部キーです。上で述べたように、このステートメントは有効なNULL以外の値で動作します。

アプリケーションのORMもそれが必要として、それはルックアップテーブルにマップするようなコードとDECODEペアを作るために、CODE値を持っています。

しかし、null値を処理する方法を理解できません。

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

編集:クイックレスポンスありがとう!私は、投稿後わずか数分で私が混乱した場所を見つけ出しました。私は質問を書くことが問題の輪郭を描くのを助けたと思う。私は、ルックアップテーブルを参照する実際のフィールドがnullであるかどうかを確認するためにステートメントを変更しました:これは私が望むように見えます。ありがとうございました!

+0

nullとは何ですか?それは '結果'部分か '事実'部分ですか?この例外はおそらく何か他のもののために発生します( 'decode'ではなく)。 –

+0

はい、ありがとうございます、私はこの質問を投稿してからわずか数分後に同じ結論に達したと思います。私はそれが大好きです。ステートメントを "var outcome = container.thing.code == null"に変更すると、不明な ":container.thing.result.decode;"私は欲しいものを手に入れます。今私にとって意味がある!説明のために – ewomack

答えて

5

いかなる次のがnullの場合は、例外を取得します:

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

私たちは、それらの値のどれを伝えることはできませんあなたの状況ではnullか、またはnullが有効な値であるかどうか。あなたはそれを解決して、あなたにヌル値を与えるものを修正するか、そのケースを扱うコードを書いてください。

0

問題はcontainer,、またはがヌルで、decodeではないという問題です。 decodeがnullの場合、??演算子は文字列を適切に設定します。

??は、いくつかのNULL可能値と、それを置き換えるためにnull以外の値をとる関数です。 ??演算子の左辺全体を評価してその関数に渡す必要があります。また、前述の変数のいずれかがnullの場合は、それ以上までは得られません。

4

メンバー階層全体をステップ実行する必要があります。例えば

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

最後のメンバがnullの場合を単にキャッチするだけでは不十分です。

+1

+1。 –