2010-05-21 8 views
6

मैं माइक्रोसॉफ्ट कोड के लिए 3.5 पुस्तकालय का उपयोग कर रहा अनुबंध"अनुबंध ब्लॉक में अनुबंध नहीं हो सकता" का अर्थ क्या है?

public object RetrieveById(int Id) 
{  
    //stuff happens... 
    Contract.Ensures(newObject != null, "object must not be null"); 
    return newProject; 
    //No error message if I move the Contract.Ensures to here 
    //But it isn't asserting/throwing a contract exception here either   
} 

मैं संकलक संदेश मिलता है: "त्रुटि 18 अनुबंध विधि में कोशिश ब्लॉक के भीतर अनुभाग 'Controller.RetrieveById (System.Int32)'

अद्यतन:

मैं यह पता लगा आपकी मदद के साथ:

  • ले जाएँ Contract.Result के खिलाफ शीर्ष पर
  • चेक

    Contract.Ensures (Contract.Result() = अशक्त, "वस्तु रिक्त नहीं होना चाहिए"!);

+0

क्या आप अपनी संपूर्ण विधि सामग्री पोस्ट कर सकते हैं। इसके अलावा - 'अनुबंध। प्रवेश' किसी भी विधि में कोड की पहली पंक्ति होना चाहिए। आपके रिटर्न स्टेटमेंट के बाद कोड पहुंच योग्य नहीं होगा। यह क्यों चल रहा है वहां कुछ भी नहीं है। –

उत्तर

6

मैं कुछ कमी हो सकती है, लेकिन मैं सिर्फ इस के लिए दस्तावेज़ को देखा:

http://msdn.microsoft.com/en-us/library/dd412865.aspx

यह कहते हैं:

इस विधि कॉल शुरुआत पर होना चाहिए किसी अन्य कोड से पहले किसी विधि या संपत्ति का ।

तो बस विधि के शीर्ष पर सुनिश्चित करें कॉल को छोड़ दें और आपको कोई समस्या नहीं होनी चाहिए।

+3

क्या एक भयानक त्रुटि संदेश है। –

2

यहाँ एक समान समाधान है:

http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/43f467f1-14b7-4e56-8030-50f842b7ba68

आपके हाल ही संपादित आपको दिखाता है कि Contract.Ensures बयान से ऊपर कोड है। Contract.Ensures अपने विधि में किसी भी अन्य कोड से पहले आना चाहिए, ताकि:

public object RetrieveById(int Id) 
{  
    //first line of method: 
    Contract.Ensures(newObject != null, "object must not be null"); 

    //stuff happens... 

    return newProject;   
} 
2

यह बहुत सरल है: एक अपवाद फेंक कर अनुबंध वर्ग संकेत अनुबंध के उल्लंघन। इसे एक कोशिश ब्लॉक में डालकर उद्देश्य को हराया जाता है, आप अपवाद को पकड़ने के लिए उत्तरदायी होते हैं।

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