2010-04-06 13 views
22

मैं एक साधारण छोटे से कोड टुकड़ा है कि मुझे निराशा होती है है: (सी # सशर्त ऑपरेटर कोई वक्तव्य नहीं है?

Only assignment, call, increment, decrement, and new object expressions can be used as a statement

HashSet.Add एक bool वापस जाने के लिए दर्ज है, इसलिए त्रिगुट:

HashSet<long> groupUIDs = new HashSet<long>(); 
groupUIDs.Add(uid)? unique++ : dupes++; 

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

जब मैं इसे फिर से सुधारता हूं, तो यह ठीक काम करता है।

कोई भी त्रुटि की व्याख्या कर सकता है, और यदि सरल टर्नरी ऑपरेटर के रूप में ऐसा करने का कोई तरीका है?

+1

मैं इसके बजाय अगर स्टेटमैन पसंद करता हूं। डमी असाइन वैरिएबल है कि कुछ उत्तरों सुझाव दे रहे हैं कि सिर्फ भ्रम जोड़ता है। –

+4

यह भी ध्यान दें कि टर्नरी आमतौर पर एक मूल्य चुनने के लिए उपयोग किया जाता है, कोई क्रिया नहीं चुनते हैं। आपके मामले में आप यह चुन रहे हैं कि दो मानों में से एक को बढ़ाया जाए या नहीं। इसलिए यदि आप कोई कार्रवाई चुन रहे हैं तो इसका उपयोग करने के लिए और अधिक अर्थपूर्ण भावना होती है। – AaronLS

उत्तर

19

त्रुटि संदेश के अनुसार टर्नरी ऑपरेटर को कथन के रूप में उपयोग नहीं किया जा सकता है। आप की तरह इस एक काम में बारी करने में कुछ करने की आवश्यकता होगी:

int dummy = groupUIDs.Add(uid)? unique++ : dupes++; 

कहा जा रहा है, मैं बस का उपयोग करने की सलाह देते हैं अगर-तो-और कुछ। यह कम भ्रमित है क्योंकि इसमें "जादू" डमी चर के निर्माण शामिल नहीं हैं ...

+1

ऐसा लगता है इसे ठीक करो। सी में, एक स्टैंडअलोन टर्नरी के साथ कुछ भी गलत नहीं है जो कुछ भी नहीं करता है। जाहिर है यह सी # में सच नहीं है। धन्यवाद। – abelenky

+9

या कोड शीतलता और पठनीयता के नुकसान के लिए एक बेकार चर के लिए मूल्य असाइन करने के बजाय, टर्नरी ऑपरेटर के बजाय यदि एक का उपयोग करें। – ANeves

+1

एक पूर्ण रूप से स्वरूपित अगर-स्टेटमेंट अतिरिक्त इंडेंटेशन स्तर के साथ 8 लाइनें लेता है। ऐसा लगता है कि इस तरह के एक सरल ऑपरेशन के लिए एक विशाल अपशिष्ट। मैं सी/सी ++ प्रोग्रामर के रूप में टर्नरी के साथ बेहद आरामदायक हूं, और कोई ठंडा-कारक नहीं देखता या यह पठनीयता को नुकसान पहुंचाता है। – abelenky

4

कंपाइलर Add के बारे में शिकायत नहीं कर रहा है यह इस तथ्य के बारे में शिकायत कर रहा है कि आपकी सशर्त अभिव्यक्ति पूरी तरह से बयान नहीं है।

कुछ भाषाओं (जावास्क्रिप्ट) की तरह आप शाखा तर्क को एक सशर्त अभिव्यक्ति का उपयोग करने के लिए की तरह तुम यहाँ किया है की अनुमति देते हैं, लेकिन सी # आवश्यकता है कि आप एक चर करने के लिए सशर्त अभिव्यक्ति का परिणाम आवंटित। एक बार जब आप अभिव्यक्ति का परिणाम आवंटित कर लेते हैं, तो आपने एक पूर्ण बयान दिया है और संकलक खुश है।

+4

असल में, यह टर्नरी ऑपरेटर के बारे में शिकायत कर रहा है। –

+0

@Andrew उन लोगों को वृद्धि नहीं माना जाएगा, हालांकि त्रुटि संदेश में वैध कथन के रूप में उल्लेख किया गया है? – AaronLS

+0

@ मरदाद - हाँ, आप सही हैं - मैं इसे ठीक कर रहा हूं। –

7

आप किसी भी चीज़ से टर्नरी का मूल्य परिणाम सेट नहीं कर रहे हैं।

HashSet<long> groupUIDs = new HashSet<long>(); 
int count = groupUIDs.Add(uid)? unique++ : dupes++; 
5

टर्नरी ऑपरेटर एक बयान नहीं है। इसलिए, यह एक निर्देश में अकेले नहीं किया जा सकता है - यह

"something that is not a statement"; 

लेखन स्पष्ट करने के लिए के बराबर है, तो आप त्रिगुट ऑपरेटर बाहर ले जाना और अगर एक का उपयोग करना चाहिए।

+0

कम से कम सी और सी ++ में, यह एक पूरी तरह से वैध है (हालांकि साइड इफेक्ट्स के बिना) कथन। जाहिर है यह सी # में सच नहीं है। सही उत्तर देता है कि डस्ट-असाइनमेंट होना चाहिए जैसा कि @sth सुझाया गया है। – abelenky

+0

यह एक महान स्पष्टीकरण है, क्योंकि यदि आप सोचते हैं कि एक टर्नरी कैसे काम करता है, तो यह एक ही मूल्य का मूल्यांकन करता है, जो मूल्य दो विकल्पों से चुना जाता है। तो एक बार मूल्यांकन किया गया यह सिर्फ बयान लिखने जैसा है जो 'अद्वितीय' का मूल्य है, (वृद्धि के बाद), या 'डुप्लिकेट'; जो '12345; 'जैसा कुछ होगा, जो कि वैध कथन नहीं होगा क्योंकि यह है बस एक अकेला पूर्णांक। – AaronLS

+1

@AaronLS: सबसे पहले, यह बढ़ने के लिए अद्वितीय प्राथमिकता का मूल्य होगा, बाद में नहीं। दूसरा, कई भाषाओं में, एकमात्र पूर्णांक होना पूरी तरह मान्य है। इस संबंध में सी # अलग है। – abelenky

0

यदि यह स्वीकार्य नहीं है, तो आपकी लाइन क्यों होगी? बस का उपयोग एक अगर :-) बयान

 bool b = false; 
     b?callB():callA(); 
1

gmcalab और sr pt सही कर रहे हैं; टर्नरी ऑपरेटर आपको परिणाम देने के लिए है, जैसे 1 + 1 आपको 2 देता है। आप केवल लिख नहीं सकते:

1 + 1;

यहां भ्रम (मुझे लगता है) यह है कि आप टर्नरी ऑपरेटर के बारे में सोच रहे हैं जैसे यह एक समारोह है।

2

तुम कुछ के लिए त्रिगुट ऑपरेटर से मान का उपयोग करने की आवश्यकता है ...

HashSet<long> groupUIDs = new HashSet<long>(); 
int newCount = groupUIDs.Add(uid)? unique++ : dupes++; 

या - उपयोग एक अगर

HashSet<long> groupUIDs = new HashSet<long>(); 
if (groupUIDs.Add(uid)) 
    unique++; 
else 
    dupes++; 
1

भाषा संदर्भ में त्रिगुट ऑपरेटर के description कहते

If condition is true, first expression is evaluated and becomes the result; if false, the second expression is evaluated and becomes the result.

कि ऐसा लगता है कि त्रिगुट केवल संदर्भ में इस्तेमाल किया जा सकता असाइनमेंट के, हालांकि भाषा संदर्भ यह स्पष्टता नहीं बताता है। आप परिणाम पर एक असाइनमेंट नहीं कर रहे हैं।

मेरी राय में, एक/अन्य के रूप में फिर से लिखना स्पष्ट होगा।

+0

इसे असाइनमेंट नहीं होना चाहिए - उदाहरण के लिए, आप इसे किसी अन्य विधि में पास कर सकते हैं। –

+0

आप सही हैं - मैं जल्दी में था और मेरा शब्द बहुत ढीला था। –

16

जैसा कि अन्य ने बताया है, सशर्त ऑपरेटर कानूनी विवरण अभिव्यक्ति नहीं है। (कानूनी कथन अभिव्यक्ति असाइनमेंट, कॉल, वेतन वृद्धि, कमी और निर्माण हैं।)

हालांकि, यहां एक स्टाइलिस्ट समस्या भी है। मेरी राय में, अभिव्यक्ति उनके मूल्य के लिए उपयोगी होनी चाहिए, और कथन उनके दुष्प्रभावों के लिए उपयोगी होना चाहिए। आप जो चल रहे हैं वह यह है कि आपके पास एक अभिव्यक्ति है जो केवल इसके दुष्प्रभाव के लिए उपयोगी है, और यह एक खराब कोड गंध है।

आपके पास दुष्प्रभाव है, इसलिए सशर्त अभिव्यक्ति के बजाय एक सशर्त कथन का उपयोग करें।

+1

@EricLippert के संबंध में, मैं इसे एक सशर्त कथन में बदल दूंगा, अगर-और। सी से सी # तक सीखने की अवस्था में एक और कदम। – abelenky

+8

@abelenky: मैं flattered हूँ, लेकिन कृपया, मेरे लिए यह मत करो। भविष्य के लोगों के लिए ऐसा करें जो आपके कोड को बनाए रखना चाहिए। :-) –

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