2010-07-15 5 views
20

हाल ही में मेरे पास एक अजीब बग था जहां मैं int? के साथ एक स्ट्रिंग को जोड़ रहा था और फिर उसके बाद एक और स्ट्रिंग जोड़ रहा था।अजीब ऑपरेटर प्राथमिकता के साथ ?? (नल कोलेसिंग ऑपरेटर)

मेरे कोड मूल रूप से इस के बराबर था:,

int? x=10; 
string s = "foo" + x ?? 0 + "bar"; 

आश्चर्यजनक पर्याप्त इस चलाने के लिए और चेतावनी या असंगत प्रकार त्रुटियों के बिना संकलित कर देगा के रूप में होगा इस:

int? x=10; 
string s = "foo" + x ?? "0" + "bar"; 

और फिर इस में जो परिणाम एक अप्रत्याशित प्रकार असंगति त्रुटि:

int? x=10; 
string s = "foo" + x ?? 0 + 12; 

के रूप में होगा इस सरल उदाहरण:

int? x=10; 
string s = "foo" + x ?? 0; 

क्या कोई यह समझा सकता है कि यह मेरे लिए कैसे काम करता है?

+0

एक संबंधित समस्या: http://stackoverflow.com/questions/3218140/null-coalescing-operator-and-lambda-expression/3218268#3218268 –

+0

और यहां एक लिंक है जो मेरा उत्तर चमक नहीं देता है ... http://stackoverflow.com/questions/3218140/null-coalescing-operator-and-lambda-expression – ChaosPandion

उत्तर

25

अशक्त कोलेसिंग ऑपरेटर बहुत कम precedence तो अपने कोड के रूप में व्याख्या की है किया जा रहा है:

int? x = 10; 
string s = ("foo" + x) ?? (0 + "bar"); 

इस उदाहरण दोनों भाव तार कर रहे हैं तो यह संकलित में, लेकिन आप क्या चाहते हैं नहीं करता है। अपने अगले उदाहरण में ?? ऑपरेटर के बाईं ओर एक स्ट्रिंग है, लेकिन दाहिने हाथ की ओर तो यह संकलन नहीं करता है एक पूर्णांक है:

int? x = 10; 
string s = "foo" + (x ?? 0) + "bar"; 
:

int? x = 10; 
string s = ("foo" + x) ?? (0 + 12); 
// Error: Operator '??' cannot be applied to operands of type 'string' and 'int' 

निश्चित रूप से समाधान कोष्ठकों को जोड़ने के लिए है

+0

आह इसलिए निम्न प्राथमिकता के कारण दोनों पक्ष लगभग दो अलग-अलग अभिव्यक्तियों का निर्माण करते हैं – Earlz

+0

यह बताता है कि क्यों 'int x = 10; स्ट्रिंग एस = "फू" + एक्स ?? "0"; ' – Earlz

10

?? ऑपरेटर + ऑपरेटर की तुलना में कम precedence है, तो आपकी अभिव्यक्ति वास्तव में के रूप में काम करता है:

string s = ("foo" + x) ?? (0 + "bar"); 

एफआईआर स्ट्रिंग "foo" और स्ट्रिंग मान x को समेकित किया गया है, और यदि यह शून्य होगा (जो यह नहीं हो सकता है), 0 का स्ट्रिंग मान और स्ट्रिंग "bar" को समेकित किया गया है।

+3

फोटो खत्म :) 1 सेकंड जीत :) –