Buradaki ana kafa karışıklığı, tüm .NET kitaplıklarının (bu durumda, BCL'nin bir parçası olmayan Genişletilmiş Sayısal Kitaplığı ) standart C # ile yazıldığını varsaymanızdır . Bu her zaman böyle değildir ve farklı dillerin farklı kuralları vardır.
Standart C # 'da, gördüğünüz kod parçası, operatör aşırı yük çözümünün çalışma şekli nedeniyle yığın taşmasına neden olur. Bununla birlikte, kod aslında standart C #'da değildir - temelde C # derleyicisinin belgelenmemiş özelliklerini kullanır. Operatörü aramak yerine şu kodu verir:
ldarg.0
ldarg.1
ceq
ret
İşte bu :)% 100 eşdeğer bir C # kodu yoktur - bu kendi türünüzle C #'da mümkün değildir .
O zaman bile, C # kodunu derlerken gerçek operatör kullanılmaz - derleyici, bu durumda olduğu gibi, op_Equality
aramayı sadece basit olanla değiştirdiği bir dizi optimizasyon yapar ceq
. Yine, bunu kendi DoubleEx
yapınızda kopyalayamazsınız - bu derleyici sihridir.
Bu kesinlikle .NET'te benzersiz bir durum değildir - geçerli olmayan birçok kod vardır, standart C #. Sebepler genellikle (a) derleyici hackleri ve (b) tuhaf (c) çalışma zamanı hackleriyle farklı bir dildir (sana bakıyorum Nullable
!).
Roslyn C # derleyicisi oepn kaynağı olduğundan, aslında sizi aşırı yük çözümünün kararlaştırıldığı yere yönlendirebilirim:
Tüm ikili operatörlerin çözümlendiği yer
İç operatörler için "kısayollar"
Kısayollara baktığınızda, çift ve çift arasındaki eşitliğin içsel çift operatörde olduğunu, asla==
tipte tanımlanan gerçek operatörde olmadığını göreceksiniz . .NET türü sistem, bunun Double
diğerleri gibi bir tür olduğunu varsaymak zorundadır , ancak C # yoktur - double
C # 'da ilkeldir.