在c#中使用数组实现泛型堆栈

时间:2012-12-27 14:27:11

标签: c# generics stack

我正在使用数组实现泛型堆栈。 但我得到错误:

无法将带[]的索引应用于“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();
    }
}

提前致谢。

4 个答案:

答案 0 :(得分:5)

这是范围问题,在

行中
data[SP] = data;

data在两种情况下都指的是data类型的本地参数T,而不是T[],因此错误。您可以使用this重命名局部变量或显式引用成员变量:

this.data[SP] = data;

答案 1 :(得分:4)

您应该将方法(推送)中的参数'data'重命名为其他名称。

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

如果字段和参数具有相同名称,则参数更强,或者您可以使用“this”关键字并将此行更改为:

        this.data[SP] = data;

顺便说一句,你可以使用Stack<T> .net ready made class,除非你是出于教育原因而实施的!

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

答案 2 :(得分:4)

我怀疑当你思考关于形式参数时,你希望data表示形式参数,而当你data表示this.data时是思考关于这个领域。 C#编译器无法读懂你的想法;在这种情况下,data将始终表示形式参数,而不是数组。

将数组命名为“values”,将值命名为“value”,而不是“data”。

此外,使用私有自动属性而非私有字段是合法但不寻常的。你有什么理由这样做吗?大多数人只对公共,受保护或内部属性使用自动属性。

答案 3 :(得分:1)

Push()中有一个名为data的参数。编译器更喜欢使用范围更窄的变量,而不是名为data的属性。由于参数为T而非T[],因此您无法使用索引器访问它。

解决方案是简单地重命名该参数,或使用this.data。我强烈建议重命名参数。