¿Por qué Json.Net llama al método Equals en mis objetos cuando se serializa?

Me encontré con un error cuando estaba usando Newtonsoft.JsonSerializeObject método. Se ha preguntado antesaqu, pero no hubo respuesta de las personas que trabajan con Newtonsoft sobre por qué sucede esto.

ásicamente, al llamar aSerializeObject Me gusta esto

string json = Newtonsoft.Json.JsonConvert.SerializeObject(from, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });

Recibo errores en muchasEquals métodos que he anulado en mis clases:

public override bool Equals(object obj)
{
    if (obj == null)
        return false;

    CapacityConfiguration cc = (CapacityConfiguration)obj; // <-- TypeCastException here; other Properties of the same class are sent in as parameter!
}

Y, por supuesto, me doy cuenta de que es "fácil" solucionarlo, marcando así:

public override bool Equals(object obj)
{
    if (obj is CapacityConfiguration == false)
        return false;

    CapacityConfiguration cc = (CapacityConfiguration)obj;
}

Pero la verdadera pregunta es:Por qué Json.Net envía otros tipos de objetos en elEquals método de la clase? Más específicamente, Json.Net parece enviar muchas otras propiedades en la clase, en lugar de otro objeto del mismo tipo.

Para mí, es completamente extraño. Cualquier aportación sería apreciada.

Estoy usando la "Versión 8.0.0.0" según Visual Studio.

UPDATE 1

Es fácil de probar, ya que es reproducible:

public class JsonTestClass
{
    public string Name { get; set; }
    public List<int> MyIntList { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        JsonTestClass jtc = (JsonTestClass)obj;
        return true;
    }
}

Y luego simplemente coloque este código en Program.cs o en cualquier otro lugar:

JsonTestClass c = new JsonTestClass();
c.Name = "test";
c.MyIntList = new List<int>();
c.MyIntList.Add(1);

string json = Newtonsoft.Json.JsonConvert.SerializeObject(c, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });

y obtendrá la excepción TypeCast:

Respuestas a la pregunta(1)

Su respuesta a la pregunta