ContainsKey是真的,但仍然没有将对象引用设置为对象的实例"

时间:2017-09-09 09:42:37

标签: c# .net

我有这样的条件

//  `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已通过,但仍然会抛出错误..

2 个答案:

答案 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");
    }