2009-08-09 8 views
5

मैं सिर्फ स्टैक ओवरफ़्लो पर यहाँ किसी के सवाल का जवाब देने चारों ओर खिलवाड़ किया गया था, जब मैं अपने दृश्य स्टूडियो (2008) के अंदर से एक स्थिर सत्यापन चेतावनी देखा:.NET कोड अनुबंध: क्या इससे अधिक बुनियादी हो सकता है?

string[] source = { "1", "A", "B" }; 
var sourceObjects = Array.ConvertAll(source, c => new Source(c)).ToArray(); 

मैं संदेश हो रही है अप्रमाणित स्रोत की आवश्यकता! = शून्य। यह मेरे लिए बहुत स्पष्ट प्रतीत होता है कि यह मामला नहीं है। यह पाठ्यक्रम का सिर्फ एक उदाहरण है। दूसरी तरफ, कुछ सुंदर निफ्टी सामान काफी अच्छी तरह से काम कर रहे हैं।

मैं 1.2.20518.12 रिलीज (18 मई) का उपयोग कर रहा हूं। मुझे कोड अनुबंध बहुत दिलचस्प लगता है, लेकिन क्या किसी और के पास इस तरह के मामले हैं? क्या आप अभ्यास में मौजूदा कार्यान्वयन को लागू करने पर विचार करते हैं, या आप इस बिंदु पर पूरी तरह अकादमिक मानेंगे?

मैं इस एक समुदाय विकी कर दिया है, लेकिन मैं कुछ राय :)

उत्तर

16

यह अगर आप दो कॉल विभाजित ऊपर अधिक समझ में आता है सुनना चाहता हूँ:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
var sourceObjects = tmp.ToArray(); 

अब यह बताते हैं समस्या के रूप में अंतिम लाइन पर। दूसरे शब्दों में, Array.ConvertAll पर कॉल जानता है कि स्रोत शून्य नहीं है, लेकिन ToArray() पर कॉल यह नहीं जानता कि tmp शून्य नहीं होगा। त्रुटि अभी भी source का प्रयोग करेंगे, भले ही आप पूरी तरह से अलग अपने चर कुछ कहा था, के रूप में यह में पहले पैरामीटर की चर्चा करते हुए है -

(आपका उदाहरण भी थोड़ा भ्रमित अपने स्रोत कोड में नाम source के उपयोग की वजह से है Enumerable.ToArray।)

असल में मेरा मानना ​​है कि यह सभी काम करेगा जब Array.ConvertAll एक उपयुक्त गैर-शून्यता पोस्टकंडिशन प्राप्त करता है। तब तक, इस चाल करना होगा:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
Contract.Assume(tmp != null); 
var sourceObjects = tmp.ToArray(); 

मैं मानता हूँ बात इस तरह की कष्टप्रद है, लेकिन मुझे यकीन है कि यह तेजी से के रूप में एमएस बीसीएल में अधिक से अधिक ठेके कहते सुधार होगा हूँ। यह ध्यान रखना महत्वपूर्ण है कि यह स्थिर चैकर के साथ कोई समस्या नहीं है।

(वास्तव में, Array.ConvertAll एक पूर्व शर्त नहीं है या तो - अगर आप ऊपर दूसरा कोड स्निपेट में शून्य पर source चर सेट, यह अभी भी शिकायत नहीं होगा।)

+1

पहले से ही अनुबंध अध्याय लिख के माध्यम से? :) –

+1

लगभग वहां, हाँ :) मैं ईमानदार होने के लिए इससे बहुत प्रभावित हूं। –

+1

मैंने अभी तक आंतरिक कार्य में अभी तक नहीं डाला है, लेकिन बेस क्लास लाइब्रेरी के मौजूदा संस्करणों में पहले से मौजूद विधियों के लिए पूर्व शर्त और पोस्टकंडिशन कैसे परिभाषित की गई हैं? मुझे लगता है कि वे जो भी क्रिकराइट आमतौर पर वितरण में उत्पन्न करते हैं उन्हें गिरा दिया? – Thorarin

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