Проблема
В настоящее время я работаю над созданием приложения.В этом приложении я работал с сериализацией Func.Это как-то разбило мое приложение без исключения.
Авария без исключения заставила меня задуматься о происходящем wtf, поэтому я немного углубился и после некоторого копания наконец-то обнаружил, что где-то в Newtonsoft.Json a List.Contains
происходит, что затем выполняет проверку на равенство для 2 свойств.
Очевидно, что в результате проверки на равенство получается бесконечный цикл, который вызывает исключение stackoverflow.
Воспроизведение проблемы только с C #
Expression<Func<string, int>> expr = (t) => t.Length;
Func<string, int> exprCompiled = expr.Compile();
var aa = exprCompiled.Method.Module;
var bb = exprCompiled.Method.Module.Assembly;
//This code results in either an infinite loop or a Stackoverflow Exception
var tempresult = aa.Equals(bb);
Console.WriteLine("This code is never executed");
Воспроизвести проблему с Newtonsoft.Json
Expression<Func<string, int>> expr = (t) => t.Length;
Func<string, int> exprCompiled = expr.Compile();
//This code results in either an infinite loop or a Stackoverflow Exception
var res = JsonConvert.SerializeObject(exprCompiled);
Console.WriteLine("This code is never executed");
Фактическая основная проблема
Выполнениенемного подробнее о том, как работает .NET framework. Думаю, проблема заключается в реализации внутреннего класса InternalAssemblyBuilder
и внутренних классов InternalModuleBuilder
.У них обоих есть переопределение метода Equals, например:
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (obj is InternalAssemblyBuilder)
{
return this == obj;
}
return obj.Equals(this);
}
Я думаю, это должно быть так:
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (obj is InternalAssemblyBuilder)
{
return this == obj;
}
return base.Equals(this); //changed obj to base
}