2016-06-02 8 views
5

फेंक दिया गया था जब मेरा कंपाइलर सेट प्रॉपर्टी निष्पादित करता है तो मेरा प्रोग्राम इस अपवाद ('System.StackOverflowException') को फेंकता है।प्रकार 'सिस्टम.स्टैक ओवरफ्लो एक्सेप्शन' का अपवाद

शराब वर्ग:

class wine 
{ 
    public int year; 
    public string name; 
    public static int no = 5; 

    public wine(int x, string y) 
    { 
     year = x; 
     name = y; 
     no++; 

    } 


    public int price 
    { 
     get 
     { 
      return no * 5; 
     } 

     set 
     { 
      price = value; 
     } 
    } 
} 

Program.cs वर्ग:

वर्ग कार्यक्रम { static void मुख्य (स्ट्रिंग [] args) {

 wine w1 = new wine(1820, "Jack Daniels"); 

     Console.WriteLine("price is " + w1.price); 
     w1.price = 90; 
     Console.WriteLine(w1.price); 
     Console.ReadLine(); 
    } 
} 
+0

आपको बैकिंग फ़ील्ड का उपयोग करने की आवश्यकता है उदा। 'निजी int _price' और फिर उस मान को सेट करें' सेट {_price = value; } ' – DGibbs

उत्तर

10

जब कीमत संपत्ति की स्थापना, आप सेटर, जो सेटर जो सेटर का आह्वान, आदि का आह्वान आह्वान ..

समाधान:

public int _price; 
public int price 
{ 
    get 
    { 
     return no * 5; 
    } 

    set 
    { 
     _price = value; 
    } 
} 
0

आपकी संपत्ति जब आप कोई मूल्य निर्धारित करते हैं तो सेटर स्वयं कॉल करता है, इस प्रकार यह एक स्टैक ओवरफ़्लो उत्पन्न करता है, मुझे लगता है कि आप क्या करना चाहते थे:

public int price 
{ 
    get 
    { 
     return no * 5; 
    } 

    set 
    { 
     no = value/5; 
    } 
} 
7

आप सेटर के भीतर सेटर का मान सेट कर रहे हैं। यह एक अनंत लूप है, इसलिए StackOverflowException।

आप शायद अपने गेटर के अनुसार एक समर्थन क्षेत्र no का उपयोग करने के लिए होती:

public int price 
{ 
    get 
    { 
     return no * 5; 
    } 

    set 
    { 
     no = value/5; 
    } 
} 

या शायद अपने स्वयं के समर्थन क्षेत्र का उपयोग करें।

private int _price; 
public int price 
{ 
    get 
    { 
     return _price; 
    } 

    set 
    { 
     _price = value;; 
    } 
} 

हालांकि, अगर उत्तरार्द्ध मामले है, तो आप सब पर समर्थन क्षेत्र की आवश्यकता नहीं है, तो आप एक ऑटो संपत्ति का उपयोग कर सकते हैं:

public int price { get; set; } // same as above code! 

(साइड नोट: गुण एक अपरकेस साथ शुरू करना चाहिए - Price नहीं price)

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