为什么转储这个JObject会在LINQPad中抛出一个AmbiguousMatchException ?



当我使用JSON在LINQPad中运行此代码时。净:

var x = JObject.Parse(
@"{
  ""data"" : [ {
    ""id"" : ""bbab529ecefe58569c2b301a"",
    ""name"" : ""Sample Name"",
    ""group"" : ""8b618be8dc064e653daf62f9"",
    ""description"" : ""Sample Name"",
    ""payloadType"" : ""Geolocation"",
    ""contract"" : ""a9da09a7f4a7e7becf961865"",
    ""keepAlive"" : 0
  } ]
}");
x.Dump();

当试图将解析后的JSON转储到LINQPad的输出窗口时,会抛出AmbiguousMatchException。为什么?据我所知,这是完全合法的JSON。http://jsonlint.com/说它也是有效的

这很可能是.Dump()如何实现的问题。

如果检查堆栈跟踪:

at System.RuntimeType.GetInterface(String fullname, Boolean ignoreCase)
at System.Type.GetInterface(String name)
at UserQuery.Main()
...

我们可以看到抛出异常的方法是System.RuntimeType.GetInterface

System.RuntimeType是在运行时使用反射时用来表示Type对象的具体类之一,所以让我们检查Type.GetInterface(String, Boolean),它有这样说:

AmbiguousMatchException
当前的Type表示一个用不同类型参数实现相同泛型接口的类型。

所以看起来GetInterface方法是用一个接口类型调用的,这个接口类型被实现了不止一次,有不同的T或类似的。

要引起同样的错误,只需将x.Dump();替换为:

var type = x.GetType().GetInterface("System.Collections.Generic.IEnumerable`1", true);

这将抛出相同的异常

下面是一个更简单的LINQPad示例,它显示了潜在的问题:
void Main()
{
    var type = typeof(Problem).GetInterface("System.Collections.Generic.IEnumerable`1", true);
}
public class Problem : IEnumerable<string>, IEnumerable<int>
{
    IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable<string>)this).GetEnumerator();
    IEnumerator<string> IEnumerable<string>.GetEnumerator() => Enumerable.Empty<string>().GetEnumerator();
    IEnumerator<int> IEnumerable<int>.GetEnumerator() => Enumerable.Empty<int>().GetEnumerator();
}

这个例子将抛出完全相同的异常。


结论: Json没有错,Json也没有错。这是LINQPad试图找出将对象转储到输出窗口的最佳方法的问题。

相关内容

  • 没有找到相关文章

最新更新