2011-08-18 18 views
19

as operator के प्रलेखन के अनुसार, as "संगत संदर्भ प्रकारों के बीच कुछ प्रकार के रूपांतरण करने के लिए प्रयोग किया जाता है"। चूंकि Nullable is actually a value type, मैं as की अपेक्षा करता हूं कि इसके साथ काम न करें। हालांकि, यह कोड संकलित करता है और चलाता है:ऑपरेटर को Nullable <T> के साथ क्यों उपयोग किया जा सकता है?

object o = 7; 
int i = o as int? ?? -1; 
Console.WriteLine(i); // output: 7 

क्या यह सही व्यवहार है? क्या as के लिए प्रलेखन गलत है? क्या मैं कुछ भूल रहा हूँ?

+3

Nullable एक मान प्रकार, मैं अपने पाठ को सही किया है। –

+0

@ मैथ्यू: धन्यवाद। वह एक भ्रमित टाइपो था। – recursive

+1

के रूप में महान चर्चा/है और Nullables - http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types – sll

उत्तर

21

यह सही व्यवहार है?

हां।

के रूप में गलत के लिए दस्तावेज़ है?

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

Am मैं कुछ याद आ रही?

आप एमएसडीएन दस्तावेज के बजाय वास्तविक सी # विनिर्देश पढ़ने पर विचार कर सकते हैं; यह अधिक निश्चित है।

2

मैंने पढ़ा:

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

और मुक्केबाजी रूपांतरण .....

+0

लेकिन यह बस आसान नहीं मुक्केबाजी, के बाद से यह सिर्फ एक सामान्य था ' int' जिसे बॉक्स किया गया था, और 'int' 'वह' as' का लक्ष्य है। – recursive

+0

आप int क्यों सोचते हैं? इस समस्या परिप्रेक्ष्य से अलग तरीके से प्रबंधित किया जाना है? – Tigran

+0

मुझे नहीं पता कि यह अलग क्यों है। एक मायने में, यह जो मैं पूछ रहा हूं उससे संबंधित है। – recursive

1

बस एक अनुमान है, लेकिन मैं यह कहना चाहूँगा बक्से ओ एक पूर्णांक के रूप में और फिर एक नल में बदल देता है।

+1

लगभग। यह * अनबॉक्स * ऑब्जेक्ट को एक पूर्णांक के रूप में पूर्णांक के रूप में, और उसके बाद इसे एक शून्य में बदल देता है। यदि अनबॉक्सिंग विफल हो जाती है तो परिणाम निश्चित रूप से एक शून्य शून्य शून्य है। –

0

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

1

के रूप में कीवर्ड के बारे में दस्तावेज़ से:

यह निम्न अभिव्यक्ति के बराबर सिवाय इसके कि अभिव्यक्ति केवल एक बार मूल्यांकन किया जाता है है।

अभिव्यक्ति प्रकार है? (प्रकार) अभिव्यक्ति: (प्रकार) अशक्त

के लिए संदर्भ उपयोग भी है यह संदर्भ प्रकार के साथ काम करता है हालांकि, कहा गया है, तो आप भी इस तरह सामान कर सकते हैं:

int? temp = null; 
if (temp is int?) 
{ 
    // Do something 
} 

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

1

स्पष्ट रूप से as operator पर एमएसडीएन दस्तावेज़ अपडेट करने की आवश्यकता है।

object o = 7; 
int i = o as **int** ?? -1; 
Console.WriteLine(i); 

आप निम्नलिखित कोड है, जहां हम मूल्य प्रकार int के साथ के रूप में ऑपरेटर का उपयोग करने की कोशिश करते हैं, तो आप उचित संकलक त्रुटि संदेश मिलता है कि ऑपरेटर के रूप में

एक संदर्भ प्रकार के साथ इस्तेमाल किया जाना चाहिए या

: नल प्रकार

वहाँ हालांकि समुदाय सामग्री अनुभाग में the link पर उद्धरण है कि एक अद्यतन है ('int' गैर-व्यर्थ मान प्रकार है)

The as operator must be used with a reference type or nullable type.