2012-12-27 81 views
5

我正在使用數組實現一個通用堆棧。 但我得到的錯誤是:在c中使用數組實現通用堆棧#

不能申請用[]索引到類型的表達式 'T' 就行了

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

您應該將方法(Push)中的參數'data'重命名爲其他名稱。

 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

哦!它是我在這裏創建的一個名稱collison錯誤。 :(非常感謝你指出這一點 –

+1

除了這個答案,每個答案都被低估了,即使所有的答案都是正確的。是不是很奇怪...... –

+0

我不知道,也許!但是我 –

5

這是一個範圍的問題,在該行

data[SP] = data; 

data是指在兩種情況下向本地參數dataT類型,而不是T[]的,因此錯誤。您可以重命名局部變量或明確參考使用this成員變量:

this.data[SP] = data; 
1

你有一個參數叫做Push()data。編譯器傾向於使用更窄範圍的變量,而不是名爲data的屬性。由於參數是T而不是T[],因此無法使用索引器訪問它。

解決方法是簡單地重命名該參數,或使用this.data。我強烈建議重命名參數。

4

我懷疑你希望data意味着正式的參數,當你想正式參數,併爲data意味着this.data當你思考有關的領域。 C#編譯器無法閱讀您的想法;在這種情況下,data將始終表示形式參數,而不是數組。

取代「數據」,將數組命名爲「值」,並將值推入「值」。

此外,這是合法的,但不尋常的是使用私人自動屬性,而不是私人領域。你有這個理由嗎?大多數人只使用公共,受保護或內部屬性的自動屬性。

+0

不錯。:)謝謝你的回覆。我將這些屬性用作私有屬性,因爲除了使用push和pop方法之外,我的堆棧的客戶端不應直接訪問這些屬性。你在這裏建議Eric最好的方式? –

+1

@AlagesanPalani:他們絕對應該是私人的,但通常如果你想存儲私人數據,你會說'私人T []值;',而不是私人T []價值{得到;組; };'。前者創造一個領域,後者創造一個無形的私人領域,然後在其周圍包裝一個財產獲取者和制定者。這不是*錯誤*,但有點奇怪,這就是爲什麼我想知道你是否有一些特定的理由來做到這一點。 –

+0

好吧,你的意思是說,如果你正在向外界展示某些東西,那麼自動屬性就是很好的選擇。如果你試圖隱藏來自外部世界的東西,使它們成爲私人領域。作爲一種良好的做法。好的,當然。它是一個很好的學習。再次感謝。 –