2010-08-17 2 views
13

मुझे विजुअल स्टूडियो 2010 के साथ सी # में यह चेतावनी क्यों मिलती है?सी # यदि कथन शॉर्टेंड ऑपरेटर (? :) परिणाम पहुंचने योग्य कोड

"Unreachable expression code detected" 
निम्नलिखित कोड ( DateTime.Now टेढ़ा-मेढ़ा हरे रंग में रेखांकित) से

:

public DateTime StartDate 
{ 
    get 
    { 
    DateTime dt = (DateTime)ViewState["StartDate"]; 
    return ((dt == null) ? DateTime.Now : dt); 
    } 
} 
+4

ठीक है, क्योंकि 'डेटटाइम' एक संरचना है और कभी भी 'शून्य' नहीं हो सकती है। तो मैं अपने 'व्यूस्टेट' में किस मूल्य की जांच करता हूं वह खाली है? – JohnB

+0

'पहुंचने योग्य अभिव्यक्ति' हमेशा के करीब मूल्यांकन करता है 'हमेशा मूल्यांकन (सत्य | गलत)' ... क्या आप निश्चित हैं कि 'dt'' null' हो सकता है? या क्लासिक 'if {} else {} 'ठीक काम करता है? –

+0

टाइपो: तो मेरे 'व्यूस्टेट' खाली होने पर मुझे किस मूल्य की जांच करनी चाहिए? – JohnB

उत्तर

38

क्योंकि दिनांक समय struct कभी नहीं अशक्त हो सकता है।

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

public DateTime StartDate 
{ 
    get 
    { 
     DateTime? dt = (DateTime?)ViewState["StartDate"]; 
     return dt ?? DateTime.Now; 
    } 
} 

या आप (the comments के रूप में) एक एक लाइनर के रूप में यह कर सकता है:

public DateTime StartDate 
{ 
    get { return (DateTime)(ViewState["StartDate"] ?? DateTime.Now); } 
} 
+1

तो क्या होता है यदि "स्टार्टडेट" कुंजी मौजूद नहीं है? – Blam

+5

@ ब्लैम: एएसपी.नेट में, यदि व्यूस्टेट कुंजी मौजूद नहीं है, तो आपको 'शून्य' मिलता है। मैं अक्सर एक ही लाइनर के साथ @ जस्टिन के समान चीज़ व्यक्त करता हूं: 'वापसी (दिनांक समय) (व्यूस्टेट ["स्टार्टडेट"] ?? डेटटाइम.अब); '। एक जादू की तरह काम करता है। – kbrimington

+0

@ ब्लाम: मैं बस खुद से पूछने की प्रक्रिया में था! @ जस्टिन: बहुत अच्छा समाधान, धन्यवाद! – JohnB

3

हो सकता है यही कारण है कि क्योंकि DateTime एक संरचना (मान प्रकार) & एक संदर्भ प्रकार नहीं है।
इसलिए, इसे शून्य के साथ तुलना करना हमेशा गलत होगा।

1

दिनांक समय नहीं हो सकता अशक्त

4

दिनांक समय एक मान प्रकार है, इसलिए यह कभी नहीं अशक्त हो सकता है। इसलिए, == नल के लिए परीक्षण संकलन समय पर निरंतर झूठे का मूल्यांकन करता है, तो आधा?: रनटाइम पर कभी नहीं पहुंचाया जाएगा।

1

डेटटाइम शून्य नहीं है, इसलिए इसका मूल्य कभी शून्य नहीं होगा।

4

पहले से दिए गए उत्तरों - कि एक गैर-शून्य मूल्य प्रकार कभी शून्य नहीं होगा, और इसलिए तुलना संकलन समय पर झूठी वापसी के लिए जानी जाती है - सही हैं, आप स्पष्ट अनुवर्ती प्रश्न के बारे में सोच रहे होंगे : यह भी कानूनी क्यों है? एसओ पर कई बार पूछा गया है; लघु संस्करण यह है कि सी # प्रत्येक संरचना के लिए "उठाया" समानता ऑपरेटर प्रदान करता है जो गैर-शून्य प्रकार पर समानता ऑपरेटर प्रदान करता है (यदि कोई उठाया गया व्यक्ति पहले से मौजूद नहीं है।)

ऐसा कहने के लिए है, क्योंकि डेटटाइम एक == ऑपरेटर प्रदान करता है, संकलक स्वचालित रूप से डेटटाइम पर == ऑपरेटर उत्पन्न करता है, और ऑपरेटर आपके मामले में लागू होता है।

+0

एक और बार पूछे जाने वाले प्रश्न। कंपाइलर अन्य चेतावनी जारी करना क्यों भूल जाता है, _ अभिव्यक्ति का परिणाम हमेशा 'झूठा' होता है क्योंकि 'System.DateTime' प्रकार के मान 'System.DateTime' प्रकार के 'शून्य' के बराबर नहीं होता है। _ _। यह चेतावनी उठाया गया है (कम से कम अधिकांश प्रकार) उठाए गए समानता ऑपरेटरों '==', जैसे '42 == नल 'में, लेकिन उपयोगकर्ता द्वारा परिभाषित ऑपरेटरों के लिए काम नहीं करेगा' == ' डेटटाइम ', जब वे उठाए जाते हैं। –

+1

@JeppeStigNielsen: गायब चेतावनी एक बग था; मुझे संदेह है कि मैंने इसे सी # 3 में पेश किया था। जब मैं माइक्रोसॉफ्ट में था तो यह पूरी तरह से इसकी जांच करने के लिए मेरे लिए पर्याप्त प्राथमिकता नहीं थी; मुझे नहीं पता कि यह Roslyn में तय किया गया था या नहीं। मुझे त्रुटि पछतावा है। –