我已经安装了“Newtonsoft.Json”版本=“10.0.3”

有两种方法:

    public static bool IsNull_yes(dynamic source)
    {
        if (source.x == null || source.x.y == null) return true;
        return false;
    }

    public static bool IsNull_exception(dynamic source)
    {
        if (source.x?.y == null) return true;
        return false;
    }

然后我有程序:
        var o = JObject.Parse(@"{  'x': null }");

        if (IsNull_yes(o) && IsNull_exception(o)) Console.WriteLine("OK");

        Console.ReadLine();
  • 当程序调用IsNull_yes方法时,结果为“true”
  • 当程序调用IsNull_exception时,结果为异常:
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:``Newtonsoft.Json.Linq.JValue'不包含'y'的定义

  • 是Newtonsoft.Json还是其他错误?

    最佳答案

    简短的答案是source.x'sort of' null。

    要看到这一点,请更改代码,如下所示:

    public static bool IsNull_exception(dynamic source)
    {
        var h = source.x;
        Console.WriteLine(object.ReferenceEquals(null, h));   // false
        Console.WriteLine(null == h);                         // false
        Console.WriteLine(object.Equals(h, null));            // false
        Console.WriteLine(h == null);                         // true
    
        if (source.x?.y == null) return true;
        return false;
    }
    

    您会注意到false写入了3次,然后是true写入了3次。因此,dynamic使用的相等性比较与object.Equals等使用的相等性比较不同。有关更多详细信息,请参见@dbc的awesome post

    不幸的是,由于并不相等,因此不会传播空传播(因为空传播不使用h == null样式比较)。

    因此,等效的IsNull_yes实现是而不是您现有的代码-
    但更接近:
    public static bool IsNull_yes(dynamic source)
    {
        if (null == source.x || source.x.y == null) return true;
        return false;
    }
    

    行为方式完全相同(即引发异常)。

    关于c# - 空传播运算符和Newtonsoft.Json 10.0.3异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47884919/

    10-13 06:24