为什么在填充我的自定义集合后,ICollection.Count中有一个循环



我以前从未做过收藏。我试图在互联网上找到解决方案,以及他们必须添加的内容才能使界面正常工作。

我添加了我在网上能找到的所有内容。

public class RecipeObjectCollection : ICollection<RecipeObject>, IList<RecipeObject>, IEnumerable<RecipeObject>, IEnumerable, IList, ICollection
{
public struct Enumerator : IEnumerator<RecipeObject>, IDisposable, IEnumerator
{
private RecipeObjectCollection collection;
private RecipeObject current;
private int next;
private readonly int version;
public RecipeObject Current => this.current;
...

我显然不能将所有内容都放在示例代码中,但在其余代码中只有继承的函数或方法。

一切都没有后顾之忧,除了我注意到当我完成填充我的收藏时,在ICollection.CountIList.this [int index]中有一个循环。

object IList.this[int index]
{
get
{
return this[index];
}
set
{
this.CheckIndex(index);
try
{
this[index] = (RecipeObject)((object)value);
return;
}
catch (InvalidCastException) { }
catch (NullReferenceException) { }
throw new ArgumentException();
}
}
int ICollection.Count
{
get
{
return this.Count;
}
}

在调试模式下,我没有找出这个循环启动的原因以及它如何或是否一次停止。尽管有这个循环,我的程序运行良好。即使我怀疑,我也不知道这是否正常。

如果缺少可以给出答案或至少提供线索的内容,我可以添加代码或其他任何内容。

虽然我确实觉得没有足够的信息来给出具体的答案,但我猜你可能在这个问题中将无限递归称为循环。

如果是这样,如果对象 IList.this[int index] setter方法中的以下行,我不会感到惊讶:

this[index] = (RecipeObject)((object)value);

将无限递归地再次调用对象 IList.this[int index] setter方法,直到达到最大递归深度。

难道你打算做类似的事情

this.collection[index] = (RecipeObject)((object)value);"

在那一行?

你不需要实现所有的方法。 如果你想使用一个集合,你可以像这样声明它。

public class  RecipeObjectCollection: List<RecipeObject>
{
//......
}
public class RecipeObject
{
//......
}

然后,您可以利用 List 对象上的现有方法。 无需实现额外方法的额外麻烦。您解释的奇怪行为可能是实现其中一种方法的结果。

最新更新