2011-01-26 6 views
40

मुझे यकीन नहीं है कि मुझे यह त्रुटि ईमानदार क्यों मिल रही है।सी # "एक शरीर घोषित करना चाहिए क्योंकि यह सार, बाहरी, या आंशिक चिह्नित नहीं है"

private int hour 
{ 
    get; 
    set 
    { 
     //make sure hour is positive 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
        "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
      //take the modulus to ensure always less than 24 hours 
      //works even if the value is already within range, or value equal to 24 
      hour = value % MAX_HOUR; 
     } 
    } 
} 

मैं भी सिर्फ एक वास्तविक संपत्ति कर की कोशिश की है:

public int hour 
{ 
    get; 
    set 
    { 
     //make sure hour is positive 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
        "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
      //take the modulus to ensure always less than 24 hours 
      //works even if the value is already within range, or value equal to 24 
      hour = value % MAX_HOUR; 
     } 
    } 
} 

सुझाव?

+0

डुप्लिकेट: http://stackoverflow.com/questions/1121940/automatic-properties-in-c-3-must-declare-a-body-for-get-if-i-declare-one- के लिए – ChristopheD

+32

एक त्वरित नोट: एक सेटर में यूआई प्रदर्शित करना वाकई एक बुरा विचार है। – driis

+8

यदि आपको मिलता है; और सेट करें; तो यह एक ऑटो संपत्ति है। यदि आप किसी एक को परिभाषित करते हैं, तो यह अब एक ऑटो प्रॉपर्टी नहीं है। – JDPeckham

उत्तर

28

इस प्रयास करें:

private int hour; 
public int Hour 
{ 
    get { return hour; } 
    set 
    { 
     //make sure hour is positive 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
      "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
      //take the modulus to ensure always less than 24 hours 
      //works even if the value is already within range, or value equal to 24 
      hour = value % MAX_HOUR; 
     } 
    } 
} 
+1

इसके बारे में सोचने का एक आसान तरीका है, घोषित किया गया है, लेकिन लागू नहीं किया गया है। – Bengie

22

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

public int Hour { get;set;} // Automatic property, no implementation 

या दोनों गेटर और सेटर के लिए अपने स्वयं के कार्यान्वयन, प्रदान करते है जो आप अपने उदाहरण से पहचानने हैं:

public int Hour 
{ 
    get { return hour; } 
    set 
    { 
     if (value < MIN_HOUR) 
     { 
      hour = 0; 
      MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
        "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     else 
     { 
       //take the modulus to ensure always less than 24 hours 
       //works even if the value is already within range, or value equal to 24 
       hour = value % MAX_HOUR; 
     } 
    } 
} 
23

आप गुण की भाग के रूप में रूप में अच्छी तरह get; भाग के लिए एक शरीर प्रदान करने की आवश्यकता y।

मुझे लगता है कि आप इस होना चाहते हैं:

private int _hour; // backing field 
private int Hour 
    { 
     get { return _hour; } 
     set 
     { 
      //make sure hour is positive 
      if (value < MIN_HOUR) 
      { 
       _hour = 0; 
       MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(), 
       "Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
      } 
      else 
      { 
       //take the modulus to ensure always less than 24 hours 
       //works even if the value is already within range, or value equal to 24 
       _hour = value % MAX_HOUR; 
      } 
     } 
    } 

कहा जा रहा है, मैं भी इस कोड को सरल बनाने पर विचार होगा। अमान्य इनपुट के लिए आपके प्रॉपर्टी सेटर के अंदर संदेशबॉक्स के बजाय अपवादों का उपयोग करना शायद बेहतर है, क्योंकि यह आपको एक विशिष्ट यूआई ढांचे से नहीं जोड़ देगा।

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

+2

लेकिन क्या 'अमूर्त', 'बाहरी', या 'आंशिक' के साथ स्वचालित गेटर कार्यान्वयन का उपयोग करना संभव होगा? –

7

आपको या तो गेटटर और सेटर दोनों के लिए एक निकाय प्रदान करना होगा, या न ही।

get { return _hour; } 

आप तय करते हैं, तो आप सेटर में तर्क की जरूरत नहीं है, आप कोई स्वचालित रूप से लागू किया जा सकता है के साथ: चूंकि आप अपने सेटर में गैर तुच्छ तर्क है, तो आप तो जैसे एक मैन्युअल रूप से लागू किया गेटर की जरूरत इसलिए जैसे संपत्ति:

public int Hour { get; set; } 
5

आप getters और setters के लिए एक शरीर प्रदान करने के लिए आप एक बुनियादी कार्यान्वयन प्रदान करने के लिए स्वचालित संकलक चाहते हैं, तो जरूरत नहीं है।

हालांकि यह तुम बस यह पूरा करने के keywork मूल्य उपयोग कर सकते हैं की तरह

<compilers> 
    <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
    <providerOption name="CompilerVersion" value="v3.5"/> 
    <providerOption name="WarnAsError" value="false"/> 
    </compiler> 
</compilers> 
0

कुछ करने के लिए अपने web.config अपडेट करके सुनिश्चित करें कि आप v3.5 संकलक का उपयोग कर रहे बनाने के लिए आप की आवश्यकता है।

public int Hour { 
    get{ 
     // Do some logic if you want 
     //return some custom stuff based on logic 

     // or just return the value 
     return value; 
    }; set { 
     // Do some logic stuff 
     if(value < MINVALUE){ 
      this.Hour = 0; 
     } else { 
      // Or just set the value 
      this.Hour = value; 
     } 
    } 
} 
संबंधित मुद्दे

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