¿Cuándo se invoca el operador == de Double?

Todo comenzó con una pregunta truculenta que alguien me hizo ... (Se menciona en el libro - C # en pocas palabras) Aquí está lo esencial.

Double a = Double.NaN;
Console.WriteLine(a == a); // => false
Console.WriteLine(a.Equals(a)); // => true

Lo anterior no parece correcto. a siempre debe ser == para sí mismo (igualdad de referencia) y ambos deben ser coherentes.

Parece que Doble sobrecarga el operador ==. Confirmado por el reflector de la siguiente manera:

[__DynamicallyInvokable]
public static bool operator ==(double left, double right)
{
    return (left == right);
}

Extraño que parece recursivo y no menciona el comportamiento específico de NaN. Entonces, ¿por qué devuelve falso?

Así que agrego un poco más de código para distinguir

var x = "abc";
var y = "xyz";
Console.WriteLine(x == y); // => false

Ahora veo

    L_0001: ldc.r8 NaN
    L_000a: stloc.0 
    L_000b: ldloc.0 
    L_000c: ldloc.0 
    L_000d: ceq 
    L_000f: call void [mscorlib]System.Console::WriteLine(bool)
    L_0014: nop 
    L_0015: ldloca.s a
    L_0017: ldloc.0 
    L_0018: call instance bool [mscorlib]System.Double::Equals(float64)
    L_001d: call void [mscorlib]System.Console::WriteLine(bool)
    L_0022: nop 
    L_0023: ldstr "abc"
    L_0028: stloc.1 
    L_0029: ldstr "xyz"
    L_002e: stloc.2 
    L_002f: ldloc.1 
    L_0030: ldloc.2 
    L_0031: call bool [mscorlib]System.String::op_Equality(string, string)
    L_0036: call void [mscorlib]System.Console::WriteLine(bool)
para los dobles, la llamada del operador == se traduce en unceq Opcode ILdonde en cuanto a las cadenas, se traduce a System.String :: op_Equality (cadena, cadena).

Suficientemente segurodocumentación paraceq especifica que está especial para los números de punto flotante y NaN. Esto explica las observaciones.

Preguntas:

¿Por qué se define la op_Equality en Double? (Y la implementación no tiene en cuenta el comportamiento específico de NaN)¿Cuándo se invoca?

Respuestas a la pregunta(3)

Su respuesta a la pregunta