2016-09-02 1 views
3

Wenn ich diesen Code ausführen in LINQPad mit JSON.NET:Warum wirft Dumping dieses JObject eine AmbiguousMatchException in LINQPad?

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

x.Dump(); 

Ein AmbiguousMatchException wird ausgelöst, wenn versucht, die geparsten JSON LINQPad das Ausgabefenster zu entleeren. Warum? Soweit ich das beurteilen kann, ist dies absolut legitim JSON. http://jsonlint.com/ sagt, es ist auch gültig.

+1

Dies ist jetzt in LINQPad v5.09.03 behoben –

Antwort

4

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.

+0

Hmm ok. Könnte ein Fehlerbericht sein, dann. Ich werde das zu den LINQPad-Foren bringen. – Hydrargyrum

+2

Ich habe ein kleineres Beispiel gezeigt, das das zugrundeliegende Problem zeigt, das wäre besser für den Fehlerbericht geeignet, um Verwirrung mit Json.net zu vermeiden. Das heißt, wenn Sie tun: 'new Problem(). Dump();' dann haben Sie Ihre Fehlerbericht Beispiel, zusätzlich zu dem 'GetInterface' Aufruf, der zeigt, welcher Teil von' Dump' ist problematisch. –

+3

Spot on - danke für die Diagnose. Ich werde morgen einen LINQPad-Fix veröffentlichen. –

Verwandte Themen