2

我正在尝试学习泛型,并且正在尝试创建自己的泛型列表类。

问题是我不知道如何绕过 default(T);

    public IEnumerator<T> GetEnumerator()
    {
        T current = data[forIndex];
        while (!current.Equals(default(T)))
        {     
            yield return current;
            forIndex++;
            current = data[forIndex];                
        }
        forIndex = 0;
    }

这种构造意味着如果它包含值 0,它将停止遍历我的列表,因为 default(T) 为 0。谁能告诉我如何解决这个问题?

4

2 回答 2

1

假设您将数据保存在数组中,只需对其进行迭代并产生每次迭代:

for(int i=0; i < data.Length; ++i)
{
  yield return data[i];
}
于 2012-09-08T14:07:26.547 回答
0

我认为你的错误是你依赖于内部数组最后只有默认值,而不是在有效数据范围内的事实。这个假设对于任何元素类型都可能是错误的(0 表示整数,null 表示 ref 类型。例如,您可以将空值存储在 aList<string>中)。

所以你不能使用这种技术。

相反,我建议您将当前项目计数保留在整数字段中。这样你就可以正确地实现你的迭代器。像这样:

for(int i=0; i < this.count; ++i) //iterating over this.count elements
  yield return data[i];

(一些代码取自另一个答案)。

现在,如果你坚持按照自己的方式去做,你可以这样做:

while (current != null)

即使电流是 T 类型并且 T 不受约束,这仍然有效。如果 T 是值类型,则条件始终为真(因为值类型将首先被装箱,并且任何装箱的值都是 != null)。

于 2012-09-08T14:28:28.547 回答