2012-12-27 40 views
5

मैं सारणी का उपयोग करके सामान्य ढेर को लागू कर रहा हूँ में सरणी का उपयोग कर। लेकिन मैं मिलता है त्रुटि के रूप में:कार्यान्वयन जेनेरिक ढेर #

प्रकार की अभिव्यक्ति के लिए [] के साथ अनुक्रमण लागू नहीं कर सकता 'टी'

लाइन पर:

data[SP] = data; 

समस्या के समाधान के लिए?

Cannot apply indexing to an expression of type 'T'

मैं भी मेरी स्थिति में यहां एक ही फिक्स को लागू करना चाहिए: भी मैं इस लिंक की जाँच की? या क्या कोई अन्य बेहतरीन विकल्प उपलब्ध है?

public class MyStack<T> 
{ 
    private T[] data { get; set; } 
    private int SP { get; set; } 
    private int Capacity { get; set; } 
    public MyStack(int capacity) 
    { 
     this.Capacity = capacity; 
     data = new T[Capacity]; 
     SP = -1; 
     // it works here, dont know why??? ;) 
     data[0] = default(T); 
    } 
    public void Push(T data) 
    { 
     ++SP; 
     if(SP>=Capacity) growArray(); 
     // This is where i get error. 
     data[SP] = data; 
    } 
    public T Pop() 
    { 
     if (SP < 0) throw new InvalidOperationException(); 
     T value = data[SP]; 
     data[SP] = default(T); 
     SP--; 
     return value; 
    } 
    public T Peak() 
    { 
     if (SP < 0) throw new InvalidOperationException(); 
     return data[SP]; 
    } 
    private void growArray() 
    { 
     throw new NotImplementedException(); 
    } 
} 

अग्रिम धन्यवाद:

यहाँ मेरी कोड है।

+5

क्या कोई विशिष्ट कारण है जिसे आप स्टैक लागू कर रहे हैं? यदि नहीं, तो आप सिर्फ इस्तेमाल कर सकते हैं [ 'System.Collections.Generic.Stack '] (http://msdn.microsoft.com/en-us/library/3278tedw.aspx) – Waldfee

उत्तर

4

आपको विधि (पुश) में किसी अन्य नाम पर पैरामीटर 'डेटा' का नाम बदलना चाहिए।

 public void Push(T d) 
     { 
     . 
     . 
     data[SP] = d; 
     . 
     . 

अगर वहाँ एक क्षेत्र है और एक ही नाम के साथ एक पैरामीटर हैं, पैरामीटर में मजबूत है, या आप उपयोग कर सकते हैं 'इस' कीवर्ड और करने के लिए इस लाइन बदलने के लिए:

 this.data[SP] = data; 

वैसे, आप Stack<T> .net ready made class का उपयोग कर सकते हैं, सिवाय इसके कि यदि आप शैक्षणिक कारणों के लिए कार्यान्वित कर रहे हैं!

This is the code of .net ready made Stack<T>

+0

ओह आदमी! यह मेरा नाम कॉलिसन बग मैंने बनाया है। :(आप उनका कहना है कि बाहर के लिए बहुत बहुत धन्यवाद। –

+1

हर सवाल का जवाब इस एक को छोड़कर downvoted किया गया है, भले ही सभी उत्तर सही हैं। है न कि अजीब ... –

+0

मैं नहीं जानता कि !, शायद! लेकिन मैं downvotes भी रूप में मुझे लगता है कि है। –

5

इस लाइन

data[SP] = data; 

data स्थानीय पैरामीटर data प्रकार T, नहीं T[] की है जो, इसलिए त्रुटि के दोनों ही मामलों में संदर्भित करता है, एक गुंजाइश मुद्दा है। आप स्थानीय चर नाम बदल सकते हैं या स्पष्ट रूप से सदस्य चर this का उपयोग कर संदर्भ:

this.data[SP] = data; 
1

आप एक पैरामीटर Push() में data कहा जाता है। संकलक data नामक संपत्ति के बजाय, अधिक संकीर्ण स्कॉप्ड चर का उपयोग करना पसंद करता है। क्योंकि पैरामीटर T और नहीं T[] है, आप इसे एक इंडेक्सर का उपयोग कर का उपयोग नहीं कर सकते हैं।

समाधान केवल उस पैरामीटर का नाम बदलने के लिए है, या this.data का उपयोग करें। मैं दृढ़ता से पैरामीटर का नाम बदलने की सलाह देते हैं।

4

मुझे लगता है कि आप data औपचारिक पैरामीटर मतलब की उम्मीद है जब आप औपचारिक पैरामीटर के बारे में सोच, और data के लिए this.data मतलब करने के लिए जब आप क्षेत्र के बारे में सोच रहे हैं। सी # कंपाइलर आपके दिमाग को नहीं पढ़ सकता है; इस मामले में data हमेशा औपचारिक पैरामीटर का अर्थ होगा, जो एक सरणी नहीं है।

"डेटा" के बजाय, सरणी "मान" और मूल्य "मूल्य" को धक्का दिया गया है।

इसके अलावा, यह निजी क्षेत्रों के बजाय निजी स्वत: गुणों का उपयोग करने के लिए कानूनी है, लेकिन असामान्य है। क्या कोई कारण है कि आप ऐसा क्यों कर रहे हैं? अधिकांश लोग केवल सार्वजनिक, संरक्षित या आंतरिक गुणों के लिए स्वचालित गुणों का उपयोग करते हैं।

+0

अच्छा। :) उत्तर के लिए धन्यवाद। मैं उन गुणों को निजी के रूप में उपयोग कर रहा हूं, क्योंकि मेरे स्टैक के क्लाइंट को पुश और पॉप विधियों का उपयोग करने के अलावा उन गुणों को सीधे एक्सेस नहीं करना चाहिए। एरिक यहाँ आप किस तरह का सुझाव देते हैं? –

+1

@AlagesanPalani: वे निश्चित रूप से निजी होना चाहिए, लेकिन आम तौर पर यदि आप निजी डेटा स्टोर करना चाहते हैं तो आप 'निजी टी [] मूल्यों' कहेंगे, 'निजी टी [] मूल्य {प्राप्त नहीं; सेट; }; '। पूर्व एक क्षेत्र बनाता है, उत्तरार्द्ध एक अदृश्य निजी क्षेत्र बनाता है और उसके बाद एक संपत्ति गेटटर और इसके चारों ओर सेटर लपेटता है। यह * गलत * नहीं है, लेकिन यह थोड़ा अजीब है, इसलिए मैंने सोचा कि क्या आपके पास ऐसा करने का कोई विशिष्ट कारण है। –

+0

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