2012-03-13 12 views
5

लघु संस्करण: out तर्क के बाद एक नामित तर्क एक कंपाइलर त्रुटि देता है, लेकिन मुझे भाषा विनिर्देश में इस व्यवहार के लिए कोई समर्थन नहीं मिल रहा है।सी # में मिक्सिंग आउट और नामांकित पैरामीटर: पैरामीटर को क्यों नामित किया जाना चाहिए?

लांग संस्करण:

मैं Enum.TryParse<TEnum> तीन पैरामीटर अधिभार उपयोग कर रहा हूँ, लेकिन मैं अपने कोड स्पष्ट करने के ignoreCase पैरामीटर, जैसा कॉल नाम के लिए पसंद करेंगे:

MyEnum res; 
b = Enum.TryParse<MyEnum>(inputString, true, out res); 

पत्ते बुलियन अस्पष्ट का अर्थ (जब तक यह विधि ज्ञात नहीं है)। इसलिए मैं उपयोग करना चाहते हैं:

b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true); 

हालांकि एक त्रुटि के रूप में संकलक रिपोर्ट करें:

Named argument 'ignoreCase' specifies a parameter for which a positional argument has already been given

और आईडीई ignoreCase पैरामीटर पर प्रकाश डाला गया। VS2010 लक्ष्यीकरण .NET 4, और VS11 बीटा या तो 4 या 4.5 लक्ष्यीकरण सभी एक ही परिणाम देते हैं। out पैरामीटर नामकरण सभी मामलों में त्रुटि को हटा देता है।

b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true); 

मैं (परहेज जेनरिक सहित) के लिए विभिन्न तरीकों की एक संख्या भर में इस की कोशिश की है , दोनों ढांचे से और मेरी विधानसभा में: हमेशा एक ही परिणाम: एक out पैरामीटर नामांकित पैरामीटर के बाद देता है एक त्रुटि।

मैं इस त्रुटि के लिए कोई कारण नहीं देख सकते हैं, और § 7.5.1 तर्क सूचियाँ सी # भाषा विशिष्टता की: संस्करण 4.0 किसी भी कारण से प्रदान करने के लिए क्यों एक out नामांकित पैरामीटर के बाद एक देना चाहिए प्रतीत नहीं होता त्रुटि। त्रुटि का पाठ एक बग के रूप में व्याख्या का समर्थन करता प्रतीत होता है: कोई स्थितित्मक तर्क नहीं है जो ignoreCase के लिए एक वैध मिलान हो सकता है।

क्या मेरा विनिर्देश गलत है? या यह एक कंपाइलर बग है?


इसलिए फ्रेमवर्क डिजाइन के दिशा निर्देशों में सलाह enum मानकों को पसंद करते हैं।

उदाहरण के लिए: दिया:

private static void TestMethod(int one, float two, out string three) { 
    three = "3333"; 
} 

इस इस कॉल का नाम भी पैरामीटर पर एक ही त्रुटि देता है जब तक out पैरामीटर को भी नामित किया गया है:

TestMethod(1, out aString, two: 1.0f); 

उत्तर

6

नाम पैरामीटर की अनुमति नहीं आप स्थितित्मक तर्क "छोड़ने" के लिए।

आपका कोड पहले दो तर्क — value और ignoreCase गुजर, उसके बाद फिर से ignoreCase गुजर के रूप में पार्स किया जाता है।
पैरामीटर के out नेस के साथ इसका कोई लेना-देना नहीं है।

आप नाम के अनुसार अंतिम पैरामीटर पास करके इसे ठीक कर सकते हैं।

+1

spec को फिर से पढ़ने पर, मैं इस दृष्टिकोण को देख सकता हूं। शर्मनाक यह PowerShell दृष्टिकोण का उपयोग नहीं करता है: नामित तर्कों के साथ नामित पैरामीटर मिलान करें और फिर शेष स्थितित्मक तर्कों के साथ शेष स्थितित्मक पैरामीटर। – Richard

3

यदि आप तर्कों का नाम देकर आदेश को पुनर्व्यवस्थित करना शुरू करते हैं, तो प्रत्येक स्थितित्मक तर्क से मिलान करने की आवश्यकता होती है, आपको नामित किए गए सभी तर्कों को पुनर्व्यवस्थित करना होगा।

तो कोड की इस पंक्ति:

b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true); 

ignoreCase साथ out res मिलान करने के लिए कोशिश करता है, और फिर आप उस पैरामीटर फिर से नामकरण, जो संकलक अप यात्राएं साथ आते हैं। शायद पहले एक के पीछे छिपकर एक और त्रुटि है, out resignoreCase के लिए एक मैच नहीं है।

तो यदि आप अनदेखा करना चाहते हैं तो स्थितित्मक तर्कों से निपटने के दौरान, आपको out res तर्क भी नाम देना होगा।

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