यहाँ मुख्य भ्रम यह है कि आप मान रहे हैं कि सभी .NET लाइब्रेरीज़ (इस मामले में, विस्तारित न्यूमेरिक्स लाइब्रेरी, जो BCL का हिस्सा नहीं है) मानक C # में लिखी गई हैं। यह हमेशा ऐसा नहीं होता है, और विभिन्न भाषाओं में अलग-अलग नियम होते हैं।
मानक C # में, जिस कोड को आप देख रहे हैं, उसके परिणामस्वरूप ऑपरेटर ओवरलोड रिज़ॉल्यूशन काम करने के तरीके के कारण स्टैक ओवरफ़्लो होगा। हालाँकि, कोड वास्तव में मानक C # में नहीं है - यह मूल रूप से C # संकलक की अनिर्दिष्ट सुविधाओं का उपयोग करता है। ऑपरेटर को कॉल करने के बजाय, यह इस कोड का उत्सर्जन करता है:
ldarg.0
ldarg.1
ceq
ret
यह बात है :) कोई 100% समतुल्य सी # कोड नहीं है - यह आपके स्वयं के प्रकार के साथ सी # में संभव नहीं है ।
फिर भी, C # कोड का संकलन करते समय वास्तविक ऑपरेटर का उपयोग नहीं किया जाता है - कंपाइलर अनुकूलन का एक गुच्छा करता है, जैसे कि इस मामले में, जहां यह op_Equality
कॉल को सरल के साथ बदल देता है ceq
। फिर, आप इसे अपने में नहीं दोहरा सकतेDoubleEx
संरचना - यह संकलक जादू है।
यह निश्चित रूप से .NET में एक अनोखी स्थिति नहीं है - बहुत सारे कोड हैं जो मान्य नहीं हैं, मानक C #। कारण आम तौर पर (ए) कंपाइलर हैक्स और (बी) एक अलग भाषा होते हैं, विषम (सी) रनटाइम हैक्स के साथ (मैं आपको देख रहा हूं,Nullable
!)।
चूंकि रोसलिन सी # कंपाइलर ओप्पन स्रोत है, मैं वास्तव में आपको उस स्थान पर इंगित कर सकता हूं जहां अधिभार संकल्प तय किया गया है:
वह स्थान जहाँ सभी बाइनरी ऑपरेटरों को हल किया जाता है
आंतरिक ऑपरेटरों के लिए "शॉर्टकट"
जब आप शॉर्टकट देखते हैं, तो आप देखेंगे कि आंतरिक डबल ऑपरेटर में दोहरे और दोहरे परिणामों के बीच समानता, कभी भी वास्तविक ==
ऑपरेटर के प्रकार पर परिभाषित नहीं होती है। .NET प्रकार की प्रणाली को दिखावा करना पड़ता है Double
जो किसी भी अन्य की तरह है, लेकिन C # नहीं - double
C # में एक आदिम है।