Dies ist ein Problem damit, wie .Dump()
am wahrscheinlichsten implementiert wird.
Wenn Sie den Stack-Trace überprüfen:
at System.RuntimeType.GetInterface(String fullname, Boolean ignoreCase)
at System.Type.GetInterface(String name)
at UserQuery.Main()
...
Wir können sehen, dass das Verfahren die Ausnahme werfen System.RuntimeType.GetInterface
ist.
System.RuntimeType
ist eine der konkreten Klassen verwendet Type
Objekte darzustellen, wenn Reflexion zur Laufzeit verwendet wird, also lassen Sie uns Type.GetInterface(String, Boolean)
überprüfen, die dies zu sagen hat:
AmbiguousMatchException
Der aktuelle Typ stellt eine Art das implementiert die gleiche generische Schnittstelle mit verschiedenen Typargumenten.
So sieht es aus wie die GetInterface
Methode mit einem Typ einer Schnittstelle aufgerufen wird, die mehr als einmal, mit verschiedenen T
‚s oder ähnlichem implementiert ist.
die gleichen Fehler zu provozieren, einfach x.Dump();
mit diesem ersetzen:
var type = x.GetType().GetInterface("System.Collections.Generic.IEnumerable`1", true);
Dies wird die gleiche Ausnahme werfen.
Hier ist ein einfaches LINQPad Beispiel, das das zugrunde liegende Problem zeigt:
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();
}
Dieses Beispiel wird genau die gleiche Ausnahme werfen.
Fazit: Es ist nichts falsch mit dem Json, noch mit Json.Net, das ist ein Problem mit, wie LINQPad versucht, den besten Weg, um herauszufinden, das Objekt in das Ausgabefenster zu entleeren.
Dies ist jetzt in LINQPad v5.09.03 behoben –