2012-12-10 20 views
13

क्या यह संभव है, लैम्ब्डा अभिव्यक्तियों में कुछ तर्कों को त्यागने के लिए उन्हें नाम न दें? ईजी। मैं एक कार्रवाई < पूर्णांक पास करना int >, लेकिन मैं केवल दूसरी परम में दिलचस्पी रखता हूँ, मैं की तरहसी # लैम्ब्डा अज्ञात पैरामीटर

(_, foo) => bar(foo) 
// or 
(, foo) => bar(foo) 

कुछ पहले मामले में यह काम कर रहा है में लिखना चाहते हैं। लेकिन पहला पैरामीटर वास्तव में अनाम नहीं है, क्योंकि इसका नाम "_" है। तो यह काम नहीं कर रहा है, जब मैं दो या दो से अधिक त्यागना चाहता हूं। मैं _ चुनता हूं क्योंकि प्रोलॉग में इसका अर्थ "कोई मूल्य" है।

तो। क्या मेरे उपयोग के मामले में कोई विशेष चरित्र या अभिव्यक्ति है?

उत्तर

8

नहीं, आप नहीं कर सकते। C# language specification व्याकरण को देखते हुए, लैम्ब्स घोषित करने के दो तरीके हैं: स्पष्ट और निहित। कोई भी आपको पैरामीटर के पहचानकर्ता को छोड़ने या पहचानकर्ताओं (नामों) का पुन: उपयोग करने की अनुमति देता है।

explicit-anonymous-function-parameter: 
    anonymous-function-parameter-modifieropt type identifier 

implicit-anonymous-function-parameter: 
    identifier 

यह सामान्य कार्यों में अप्रयुक्त फ़ंक्शन पैरामीटर के समान है। उन्हें एक नाम दिया जाना है।

बेशक आप पैरामीटर में से किसी एक के नाम के रूप में _ का उपयोग कर सकते हैं, क्योंकि यह एक वैध सी # नाम, है लेकिन इसका कोई मतलब विशेष नहीं है।

सी # 7, _ का एक विशेष अर्थ है। लैम्ब्डा अभिव्यक्ति पैरामीटर नामों के लिए नहीं, बल्कि निश्चित रूप से अन्य चीजों के लिए, जैसे पैटर्न मिलान, deconstruction, बाहर चर और यहां तक ​​कि नियमित असाइनमेंट। (उदाहरण के लिए, आप _ = 5 का उपयोग कर सकते हैं; _ घोषित किए बिना।)

+2

अंत का उपयोग नहीं करना चाहते हैं के लिए मूल रूप से है _' * क्या * सी # 7 के रूप में एक विशेष अर्थ है। लैम्ब्डा अभिव्यक्ति पैरामीटर नामों के लिए नहीं (जहां तक ​​मैं कह सकता हूं) लेकिन निश्चित रूप से अन्य चीजों के लिए, जैसे पैटर्न मिलान, deconstruction, 'out' चर और यहां तक ​​कि नियमित असाइनमेंट भी। (उदाहरण के लिए, आप '_ = 5;' का उपयोग किए बिना '_ = 5; 'का उपयोग कर सकते हैं।) मुझे एहसास है कि यह उत्तर सी # 7 से कई साल पहले लिखा गया था, लेकिन यह देखते हुए कि आखिरी पंक्ति गलत हो गई है, तो इसे संपादित करना अच्छा होगा आपके पास समय है। –

+1

@ जोन्स स्केट ध्यान देने के लिए धन्यवाद, मैंने आपकी टिप्पणियों को एक संपादन में जोड़ा। मुझे भविष्य की भविष्यवाणी करने में बेहतर होना चाहिए। –

+0

मैं अक्सर एक ही स्थिति में हूं - इस मामले में मैंने वास्तव में यह नहीं देखा था कि यह थोड़ी देर के लिए पुराना जवाब था ... नए जवाब ने सामने वाले पृष्ठ पर सवाल रखा था। –

5

संक्षिप्त उत्तर है: नहीं, आपको प्रत्येक पैरामीटर का नाम देना होगा, और नामों को अद्वितीय होना चाहिए।

आप _ का उपयोग एक पैरामीटर नाम के रूप में कर सकते हैं क्योंकि यह सी # में मान्य पहचानकर्ता है।
हालांकि, आप केवल एक बार इसका उपयोग कर सकते हैं।

+4

यही वजह है कि मैं इतनी बार के साथ '(_, __, ___, foo) => {...}' ' – Basic

0

सी # 7 में, आप त्याग का उपयोग कर सकते हैं। डिस्क केवल वेरिएबल्स लिखते हैं जिन्हें आप पढ़ नहीं सकते हैं। यह चर है कि आप अधिक जानकारी के here

+1

यह सच है और अन्य उत्तरों से चूक गया है, लेकिन जहां तक ​​मैं बता सकता हूं लैम्ब्डा अभिव्यक्ति पैरामीटर के मामले में प्रासंगिक नहीं है। (उदाहरण के लिए आप '(_, _, x) => x' का उपयोग नहीं कर सकते हैं।) –

+0

@ जोनस्केट ताकि आप इसका उपयोग नहीं कर सकें? (_, foo) => बार (foo) –

+1

आप कर सकते हैं, लेकिन फिर '_' केवल एक नियमित पैरामीटर है। आप '(_, _, x) 'का उपयोग नहीं कर सकते हैं क्योंकि तब आप एक ही पैरामीटर दो बार घोषित करेंगे। (जबकि आप पैटर्न में कई बार '_' का उपयोग कर सकते हैं।) –