5

我正在使用数组实现一个通用堆栈。但我得到错误:

无法将带有 [] 的索引应用于“T”类型的表达式

在线上:

 data[SP] = data;

如何解决这个问题?我也检查了这个链接:

无法将索引应用于“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

4 回答 4

5

这是一个范围问题,在行中

data[SP] = data;

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

this.data[SP] = data;
于 2012-12-27T14:32:22.490 回答
5

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

而不是“数据”,将数组命名为“值”,并将被推送的值命名为“值”。

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

于 2012-12-27T14:35:07.577 回答
4

您应该将方法 (Push) 中的参数“数据”重命名为另一个名称。

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

如果存在同名的字段和参数,则参数更强,或者可以使用'this'关键字并将此行更改为:

        this.data[SP] = data;

顺便说一句,您可以使用Stack<T>.net 现成的课程,除非您出于教育原因而实施!

这是.net现成的代码Stack<T>

于 2012-12-27T14:29:58.840 回答
1

你有一个参数Push()被调用data。编译器更喜欢使用范围更窄的变量,而不是名为data. 因为参数是 aT而不是T[],所以您不能使用索引器访问它。

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

于 2012-12-27T14:32:43.943 回答