3

谁能解释Newtonsoft.Json.Linq.JToken(来自 Json.NET 4.5)和Shouldly 1.1.1.1 之间的这种奇怪的交互?

这是完整的 C# 代码:

using Newtonsoft.Json.Linq;
using NUnit.Framework;  
using Shouldly;

public class Tests
{
    [Test]
    public void this_test_passes()
    {
        JToken.Parse("{}").ShouldBe("hello");
    }
}

注意:字符串"hello"不是特殊的,它可以是任何字符串。

我猜这与隐式转换为某种类型有关,该类型覆盖Equals(...)为所有字符串或其他东西返回true。但这是我能做的最好的,谁能解释这里到底发生了什么?

编辑:我已经为这个问题提交了一个补丁,如果它被合并到 master 中会再次更新。

更新:为下一个版本修复了问题... :) https://github.com/shouldly/shouldly/issues/65#issuecomment-34579229

4

1 回答 1

4

请注意,此通用类型解析给出:

JToken.Parse("{}").ShouldBe<JToken>("hello");

使用隐式转换运算符 from stringto JToken- 所以我们实际上是在比较两个JTokens,而不是 aJToken和 a string

这失败了,因为JToken : IEnumerable<JToken>,指的是子令牌。NUnit 因此决定只执行序列相等测试。对于这两者,没有子序列:

JToken x = JToken.Parse("{}");
Console.WriteLine(x.Any()); // False
JToken y = "hello";
Console.WriteLine(y.Any()); // False

并且两个空序列通常被认为是相等的。

有关信息(来自元数据,而不是来源):

public abstract class JToken : IJEnumerable<JToken>,
      System.Collections.Generic.IEnumerable<JToken>, IEnumerable,
      IJsonLineInfo, ICloneable, IDynamicMetaObjectProvider
{
    // ...
    public static implicit operator JToken(string value);
    // ...
}
于 2013-11-15T11:02:22.110 回答