これは、.Dump()
実装方法に問題がある可能性が最も高いです。
スタック トレースを確認すると、次のようになります。
at System.RuntimeType.GetInterface(String fullname, Boolean ignoreCase)
at System.Type.GetInterface(String name)
at UserQuery.Main()
...
例外をスローするメソッドが であることがわかりますSystem.RuntimeType.GetInterface
。
System.RuntimeType
Type
は、実行時にリフレクションが使用されるときにオブジェクトを表すために使用される具体的なクラスの 1 つです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.Net にも問題はありません。これは、LINQPad がオブジェクトを出力ウィンドウにダンプする最善の方法を見つけようとする方法に問題があります。