我已经安装了“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();
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/