2010-09-04 15 views
7

निम्नलिखित कोड मुझे चेतावनी देता है Contract class 'FooContracts' should be an abstract class। उन सभी उदाहरणों से मैंने ऑनलाइन पढ़ा है (उदा। http://www.infoq.com/articles/code-contracts-csharp), यह काम करना चाहिए (संभावित रूप से कंपाइलर चेतावनियों के बिना)।अनुबंध वर्ग एक अमूर्त वर्ग होना चाहिए

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
    void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal sealed class FooContracts : IFoo { 
    void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
    } 
} 

मैं दृश्य स्टूडियो 2010 में हूँ, इस परियोजना के गुणों का Code Contracts अनुभाग में निम्न सेटिंग के साथ:

  • क्रम अनुबंध जाँच हो रही है (Full के लिए सेट) प्रदर्शन करना
  • प्रदर्शन स्टेटिक अनुबंध जाँच हो रही है (Static Checking के तहत) पृष्ठभूमि में
  • चेक

मैंने रीशेर्पर को बंद करने के लिए CONTRACTS_FULL संकलन प्रतीक भी परिभाषित किया।

क्या मुझे चेतावनी के बिना इस संकलन को बनाने के लिए कुछ याद आ रही है?

उत्तर

9

धारा code contracts manual की 2.8 विशेष रूप से कहा गया है कि यह एक अमूर्त वर्ग होना चाहिए:

उपकरण उम्मीद करते हैं कि अनुबंध वर्ग सार है और इंटरफ़ेस इसके लिए अनुबंध प्रदान कर रहा है लागू करता है।

+1

हुह। लिंक के लिए धन्यवाद। उस तथ्य को मैंने कभी भी उल्लेख नहीं किया और न ही किसी भी उदाहरण कोड में प्रदर्शित किया। – tmont

3

सबसे अधिक संभावना है कि आप जिस सूचनात्मक आलेख का संदर्भ दे रहे हैं वह गलत है। यह गहराई में सी # के "प्रारंभिक पहुंच" संस्करण पर आधारित है, इसलिए कोड अनुबंध कार्यान्वयन शायद उस समय के बीच बदल गया जब अध्याय/आलेख मूल रूप से लिखा गया था और .NET 4 जारी किया गया था।

निम्नलिखित कोड काम करना चाहिए:

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
    void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal abstract class FooContracts : IFoo { 
    void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
    } 
} 

अनुबंध वर्ग सार होना चाहिए।

+0

लेकिन क्लास अमूर्त बनाने का मतलब है कि आप इंटरफ़ेस को लागू करने के बाद इसे नया नहीं कर सकते :(इसके आसपास कोई विकल्प? अन्य जो एक नई ठोस वर्ग बनाते हैं जो अमूर्त वर्ग से प्राप्त होता है? – bitek

+1

@MnemonicFlow आपको उदाहरण नहीं बनना चाहिए वैसे भी अनुबंध वर्ग। यह केवल कोड अनुबंध इंजन द्वारा उपयोग के लिए है। – piedar