2009-06-24 17 views
49

मुझे पता है कि आप मौजूदा ऑपरेटर को अधिभारित कर सकते हैं। मैं जानना चाहता हूं कि नया ऑपरेटर बनाना संभव है या नहीं। मेरा परिदृश्य यहाँ है।क्या सी # में नया ऑपरेटर बनाना संभव है?

var x = (y < z) ? y : z; 

इस के बराबर होने के लिए::

मैं यह चाहता हूँ

var x = y <? z; 

दूसरे शब्दों में, मैं अपने खुद के <? ऑपरेटर बनाना चाहेंगे।

+0

कोई भाषा यह क्षमता ... – AminM

+7

@JesonPark है - सही नहीं है। एफ # ने इसे दूसरों के रूप में इंगित किया है, और [सी ++ में भी यह है।] (Http: // stackoverflow।कॉम/प्रश्न/151539 9/कैन-यू-मेक-कस्टम-ऑपरेटर-इन-सी) [कॉफीस्क्रिप्ट] (http://coffeescript.org/) कई नए ऑपरेटरों को जावास्क्रिप्ट मुहावरे के लिए वाक्य रचनात्मक चीनी के रूप में प्रदान करता है, और यह इतना अनुकूलन है कि आप कस्टम ऑपरेटर की अनुमति के रूप में इसका वर्णन कर सकते हैं। आखिरी वाला थोड़ा मुश्किल है, क्योंकि आप तकनीकी रूप से भाषा का विस्तार कर रहे हैं। –

+0

@ जस्टिन मॉर्गन: जैसा कि कोडप्रोजेक्ट आलेख में उल्लिखित है _ "सी ++ ऑपरेटर ओवरलोडिंग का समर्थन करता है, लेकिन आपको अपने ऑपरेटरों को बनाने की अनुमति नहीं है" _ यह अनुकरण है !! – AminM

उत्तर

33

नहीं, यह संभव नहीं है। आपको

27

नहीं, बल्कि आप some existing operators को सी # में अधिभारित कर सकते हैं।

कुछ अन्य भाषाओं में, एफ # की तरह, आप उपयोग कर सकते हैं:

let (<?) = min 
+4

वास्तव में, यह न्यूनतम होना चाहिए , अधिकतम नहीं;) –

17

के रूप में अन्य उत्तर कहा है, तुम नहीं एक नया ऑपरेटर बना सकते हैं - कम से कम, नहीं lexer और पार्सर को बदले बिना कि कंपाइलर में बनाया गया है। असल में, कंपाइलर को यह पहचानने के लिए बनाया गया है कि < या ? या >> याजैसी कोई जोड़ी एक ऑपरेटर है और इसे विशेष रूप से इलाज करने के लिए एक व्यक्तिगत चरित्र है; यह जानता है कि i<5 उदाहरण के लिए एक चर नाम के बजाय एक अभिव्यक्ति है। एक ऑपरेटर के रूप में ऑपरेटर को पहचानना ऑपरेटर वास्तव में क्या करता है यह तय करने से एक अलग प्रक्रिया है, और संकलक में अधिक कसकर एकीकृत है - यही कारण है कि आप बाद वाले को अनुकूलित कर सकते हैं लेकिन पूर्व में नहीं।

उन भाषाओं के लिए जिनके पास ओपन-सोर्स कंपाइलर (जैसे जीसीसी) है, सैद्धांतिक रूप से, एक नए ऑपरेटर को पहचानने के लिए संकलक को संशोधित कर सकते हैं। लेकिन यह विशेष रूप से आसान नहीं होगा, और इसके अलावा, हर किसी को आपके कोड का उपयोग करने के लिए अपने कस्टम कंपाइलर की आवश्यकता होगी।

+0

बस स्पष्टता के लिए, सी ++ में लोग इस तरह की चीजों को करने के लिए मैक्रोज़ का उपयोग करते हैं? मैं सिर्फ पूछ रहा हूँ सी ++ नहीं जानता। –

+0

या केवल उन भाषाओं का उपयोग करें जहां ऑपरेटर इन्फिक्स विधियां हैं, जैसे स्कैला या एफ # –

5

न केवल आप ऐसा नहीं कर सकते हैं, लेकिन आप क्यों चाहेंगे?

मुझे यकीन है कि क्या अपने y और z हैं टाइप नहीं कर रहा हूँ, लेकिन अगर वे एक अंकीय मान प्रकार के होते हैं, तो आप शायद इस्तेमाल कर सकते हैं:

var x = Math.Min(y, z); 

हालांकि व्यक्तिगत रूप से, मैं अभी भी पसंद करेंगे:

var x = (y < z) ? y : z; 

लेकिन मैं थोड़ा सा हूँ? : जंकी।

अच्छा कोड केवल तंग और कुशल नहीं है, बल्कि पठनीय भी है। भले ही आप इसे कभी पढ़ रहे हों, फिर भी आप उस दिन <? ऑपरेटर पर वापस आ जाएंगे और आश्चर्यचकित होंगे कि बिल्ली ने क्या किया।

+2

यदि यह किसी अन्य भाषा में ज्ञात विशेषता है तो यह प्रश्न पूछता है: http://stackoverflow.com/questions/523403/can-i-define-a- perl-like-binding-operator-in-c –

+0

किसी भी ऑपरेटर ओवरलोडिंग – JNF

+5

से असहमत होने के लिए भी कहा जा सकता है। मुझे लगता है कि ऑपरेटर ओवरलोडिंग कई मामलों में समझ में आता है। उदाहरण के लिए, यदि एक प्रकार के दो उदाहरण एक साथ जोड़ते हैं तो समझ में आता है, आप एक एडर() विधि बनाने के बजाय + ऑपरेटर को अधिभारित करना चाहेंगे। सहजता से, कोई "+" देखता है और वे समझते हैं कि ऑपरेटर अंकगणितीय रूप से दो चीजों को जोड़ रहा है। अगर अधिभार प्रभावी ढंग से कर रहा है, तो यह आसानी से समझा जा सकता है। –

2

नहीं है, लेकिन आप एक्सटेंशन के तरीके के बजाय इस

y.MethodName(z) 
+14

2. गेटमिन (1) अजीब – Dario

+5

2.IfNotSmallEnoughThen (1) :) –

+0

मेरे पास सच है। एक्सर (झूठा) यहां ... :( – SparK

-3

आप % या + जैसे अन्य ऑपरेटर को ओवरलोड करने के लिए एक <? ऑपरेटर के रूप में कार्य करने के लिए कोशिश कर सकते हैं की बना सकते हैं।

मज़ा होगा

+1

यह उनके प्रश्न का उत्तर नहीं है। –

संबंधित मुद्दे