プリミティブ型のソースは混乱する可能性があります。Double
構造体の最初の行を見ましたか?
通常、次のような再帰的な構造体は定義できません。
public struct Double : IComparable, IFormattable, IConvertible
, IComparable<Double>, IEquatable<Double>
{
internal double m_value; // Self-recursion with endless loop?
// ...
}
プリミティブ型は、CILでもネイティブサポートされています。通常、それらはオブジェクト指向型のようには扱われません。float64
CILのように使用される場合、doubleは64ビット値です。ただし、通常の.NETタイプとして処理される場合、実際の値が含まれ、他のタイプと同様のメソッドが含まれます。
したがって、ここに表示されるのは、オペレーターにとって同じ状況です。通常、double型を直接使用すると、呼び出されることはありません。ところで、そのソースはCILでは次のようになります。
.method public hidebysig specialname static bool op_Equality(float64 left, float64 right) cil managed
{
.custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor()
.custom instance void __DynamicallyInvokableAttribute::.ctor()
.maxstack 8
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: ceq
L_0004: ret
}
ご覧のとおり、無限ループはありません(ceq
を呼び出す代わりに計測器を使用していますSystem.Double::op_Equality
)。したがって、doubleがオブジェクトのように扱われると、operatorメソッドが呼び出され、最終的float64
にはCILレベルのプリミティブ型として処理されます。