我正在使用数组实现泛型堆栈.但我得到的错误是:
无法将带有[]的索引应用于类型为"T"的表达式
在线上:
data[SP] = data;
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?我也查了这个链接:
我也应该在我的情况下实施相同的解决方案吗?或者还有其他最佳选择吗?
这是我的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
这是一个范围问题,在行中
data[SP] = data;
Run Code Online (Sandbox Code Playgroud)
data
在两种情况下都指的data
是类型的本地参数T
,而不是T[]
错误.您可以使用以下命令重命名局部变量或显式引用成员变量this
:
this.data[SP] = data;
Run Code Online (Sandbox Code Playgroud)
我怀疑data
当您考虑形式参数时,您期望指的是形式参数,而当您考虑领域时则data
指的是形式参数。C# 编译器无法读懂您的想法;在这种情况下,将始终表示形式参数,它不是数组。this.data
data
而不是“数据”,将数组命名为“值”,并将被推送的值命名为“值”。
此外,使用私有自动属性而不是私有字段是合法但不寻常的。你这样做有什么原因吗?大多数人只将自动属性用于公共、受保护或内部属性。
您应该将方法(Push)中的参数“data”重命名为其他名称。
public void Push(T d)
{
.
.
data[SP] = d;
.
.
Run Code Online (Sandbox Code Playgroud)
如果存在同名的字段和参数,则该参数更强,或者您可以使用 'this' 关键字并将这一行更改为:
this.data[SP] = data;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以使用Stack<T>
.net 现成的类,除非您出于教育原因而实施!
归档时间: |
|
查看次数: |
4521 次 |
最近记录: |