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

本文关键字:实现 泛型 堆栈 数组 | 更新日期: 2023-09-27 17:49:35

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

不能对'T'类型的表达式应用[]索引

on line:

 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();
    }
}

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

这是一个作用域问题,在

这一行
data[SP] = data;

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

this.data[SP] = data;

我怀疑当您考虑形式参数时,您期望data表示形式参数,而当您考虑字段时,data表示this.data。c#编译器不能读懂你的思想;在这种情况下,data总是表示形式形参,它不是数组。

将数组命名为"values",将被推送的值命名为"value",而不是"data"。

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

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

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

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

        this.data[SP] = data;

顺便说一下,你可以使用Stack<T> .net现成的类,除非你是为了教育的原因而实现!

这是。net准备好的Stack<T>代码

Push()中有一个名为data的参数。编译器更倾向于使用范围更窄的变量,而不是称为data的属性。因为参数是T而不是T[],所以不能使用索引器访问它。

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