मैं यह कोड लिख रहा था:
private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion)
{
switch (criterion.ChangeAction)
{
case BindingType.Inherited:
var action = (byte)ChangeAction.Inherit;
return (x => x.Action == action);
case BindingType.ExplicitValue:
var action = (byte)ChangeAction.SetValue;
return (x => x.Action == action);
default:
// TODO: Localize errors
throw new InvalidOperationException("Invalid criterion.");
}
}
और एक संकलन त्रुटि खोजने के लिए आश्चर्यचकित था:
'स्क्रिया' नामक एक स्थानीय चर पहले से ही इस दायरे में परिभाषित किया गया है
यह हल करने के लिए एक बहुत आसान मुद्दा था; बस दूसरे से छुटकारा पाने की varकोशिश की।
caseब्लॉकों में घोषित रूप से चर में माता-पिता का दायरा होता है switch, लेकिन मैं उत्सुक हूं कि ऐसा क्यों है। यह देखते हुए कि सी # निष्पादन अन्य मामलों के माध्यम से गिरावट (यह अनुमति नहीं है की आवश्यकता है break , return, throw, या goto caseहर के अंत में बयान caseब्लॉक), यह काफी अजीब लगता है कि यह चर घोषणाओं की अनुमति होगी के अंदर एक caseकिसी अन्य में चर के साथ इस्तेमाल किया या संघर्ष किए जाने की case। दूसरे शब्दों में, चर caseबयानों के माध्यम से गिरते दिखाई देते हैं , हालांकि निष्पादन नहीं हो सकता है। सी # अन्य भाषाओं के कुछ निर्माणों को भ्रमित करने या आसानी से दुरुपयोग करने पर रोक लगाकर पठनीयता को बढ़ावा देने के लिए बहुत पीड़ा देता है। लेकिन ऐसा लगता है कि यह सिर्फ भ्रम पैदा करने के लिए बाध्य है। निम्नलिखित परिदृश्यों पर विचार करें:
अगर इसे इसे बदलना था:
case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: return (x => x.Action == action);मुझे " अप्रमाणित स्थानीय चर 'कार्रवाई' का उपयोग मिलता है "। यह भ्रामक है क्योंकि C # में प्रत्येक अन्य निर्माण में मैं
var action = ...चर को आरंभ करने के बारे में सोच सकता हूं , लेकिन यहां यह केवल इसे घोषित करता है।अगर मुझे इस तरह के मामलों की अदला-बदली करनी थी:
case BindingType.ExplicitValue: action = (byte)ChangeAction.SetValue; return (x => x.Action == action); case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action);घोषित होने से पहले मुझे " स्थानीय चर 'क्रिया का उपयोग नहीं किया जा सकता है "। इसलिए केस ब्लॉक का क्रम यहां एक तरह से महत्वपूर्ण प्रतीत होता है जो पूरी तरह से स्पष्ट नहीं है - आम तौर पर मैं इन्हें किसी भी क्रम में लिख सकता हूं जो मैं चाहता हूं, लेकिन क्योंकि
varपहले ब्लॉकactionका उपयोग किया जाना चाहिए , जहां मुझेcaseब्लॉक ब्लॉक करना होगा तदनुसार।अगर इसे इसे बदलना था:
case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: action = (byte)ChangeAction.SetValue; goto case BindingType.Inherited;तब मुझे कोई त्रुटि नहीं मिलती है, लेकिन एक अर्थ में, ऐसा लगता है कि घोषित होने से पहले चर को एक मान सौंपा जा रहा है।
(हालांकि मैं किसी भी समय के बारे में नहीं सोच सकता जो आप वास्तव में ऐसा करना चाहते हैं - मुझेgoto caseआज से पहले पता भी नहीं था)
तो मेरा सवाल यह है कि, C # के डिज़ाइनरों ने caseअपने स्थानीय स्कोप को ब्लॉक क्यों नहीं किया ? क्या इसके कोई ऐतिहासिक या तकनीकी कारण हैं?
switch- मैं इस डिज़ाइन के पीछे तर्क के बारे में उत्सुक हूं।
breakसंभव नहीं है।
actionसे पहले अपने चर को घोषित करेंswitch, या प्रत्येक मामले को अपने ब्रेसिज़ में डालें, और आपको समझदार व्यवहार मिलेगा।