我有这样的条件
// `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
已通过,但仍然会抛出错误..
答案 0 :(得分:3)
虽然密钥"ord_82"
存在,但它映射的值仍然可以为null。因此,xyz["ord_82"].ToString()
仍然可以通过NullReferenceException
。
使用C#6.0中的?.
运算符:
Print(xyz["ord_82"]?.ToString());
请注意,这会为null
的参数生成Print
,以便您可以这样做:
Print(xyz["ord_82"]?.ToString() ?? "");
对于早期版本的C#,请使用?:
运算符(?.
只是一种糖语法:
var value = xyz["ord_82"];
Print(value == null ? "" : value.ToString());
答案 1 :(得分:0)
xyz["ord_82"] = Func() ;// That Returns "MyCustomType" object
检查Func()
是否返回MyCustomType的空对象
xyz["ord_82"].ToString()
返回的值调用 xyz["ord_82"]
,该值为null,null上的.ToString()
将抛出&#34;对象引用未设置为对象的实例&#34;异常是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");
}