2017-09-09 18 views
-1

「オブジェクト参照がオブジェクトインスタンスに設定されていない」にContainsKeyはtrueですが、それでも私は、このような条件を持っている

// `xyz` is a `dictionary<string, MyCustomType>`. 
if(smth){ 
    xyz["ord_82"] = Func() ;// That Returns "MyCustomType" object 
} 
if(xyz.ContainsKey("ord_82"){ 
    Print("started"); 
    Print(xyz["ord_82"].ToString()); // <---------------- sometimes this line throws "Object reference not set to an instance of an object" 
    Print("ended"); 
} 

私は..あなたが見るContainsKeyが渡されたことを、理由かもしれない何かを見つけるcouldntの

+2

は、だからあなたは何 'XYZ [ "ord_82"]'戻って見たのですか?おそらくそれは完全に有効なヌルを返すでしょう... –

+1

この種の問題については、 'ContainsKey'と' [] 'ではなく' TryGetValue'を使うべきです。それはより演奏されるでしょう。 'TryGetValue'に変更しても問題は解決しません。@GiladGreenの解を読む必要があります。 – mjwills

+0

@mjwills thnks! –

答えて

3

キー"ord_82"が存在しますが、それによってマップされた値は引き続きnullになる可能性があります。したがって、xyz["ord_82"].ToString()は、NullReferenceExceptionまで変更することができます。

使用?.オペレータからC#6.0:

あなたが行うことができますので、これは nullPrintの引数を生成することを
Print(xyz["ord_82"]?.ToString()); 

お知らせ:C#の以前のバージョンについては

Print(xyz["ord_82"]?.ToString() ?? ""); 

?:演算子を使用してください(?.は砂糖構文です:

var value = xyz["ord_82"]; 
Print(value == null ? "" : value.ToString()); 
+0

ありがとう! net 3.5と同様のソリューションを私に与えることができますか? '? 'は3.5で動作しません –

+1

@ T.Todua - アップデートを参照してください –

+3

@ T.Todua:'?.'は.NET 3.5でうまく動作しますが、C#6コンパイラが必要です。 *フレームワーク*の機能(または実際にはCLRの機能)と*言語*の機能の違いについては、明らかに価値があります。古いフレームワークをターゲットにしている場合でも、新しい言語機能を使用することがよくあります。 –

0

xyz["ord_82"] = Func() ;// That Returns "MyCustomType" object

チェックするFunc()がMyCustomType

xyz["ord_82"].ToString()のnullオブジェクトを返している場合がオブジェクト参照がに設定されていない」スローされますnullでxyz["ord_82"]とヌルの.ToString()によって返された値で呼び出されますオブジェクトのインスタンス "例外:NullReferenceException

したがって、コードは次のように変更する必要があります。

// `xyz` is a `dictionary<string, MyCustomType>`. 
    if(smth){ 
    var obj = Func(); // That Returns "MyCustomType" object 
    if(obj != null) { 
     xyz["ord_82"] = obj; 
    } 
    } 

など:

if(xyz.ContainsKey("ord_82") && xyz["ord_82"] != null){ 
    Print("started"); 
    Print(xyz["ord_82"].ToString()); 
    Print("ended"); 
    } 
+0

2番目のコードブロックはハッシュルックアップを3回実行します - 'TryGetValue'を使用した場合、はるかに高速)。 – mjwills

+0

これは本当ですが、このコードを最適化する方法はたくさんあります。 – rAhulD

関連する問題