2

我有一个以我的类型形式设置的公共属性,ListE<T>其中:

public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

是的,它很拗口,但这就是设计器需要它在“属性”窗口中显示为可编辑集合的条件。它做了什么!因此,我单击小 [..] 按钮来编辑集合,然后单击添加以将项目添加到集合中。

算术运算导致溢出。

现在,这是一个非常基本的列表,只不过是一个扩展数组。整个事情中唯一接近算术的部分是扩展函数,即使它使用左移而不是乘法,也不会溢出。这一切都让我认为这个异常是在设计器内部引发的,可能是由于我对实现细节的一些小疏忽造成的,但我找不到测试或调试该场景的方法。有没有人有任何聪明的想法?

编辑:是的,我可以成功使用该属性,甚至可以手动使用,即。在OnLoad处理程序中,我想如果我不能让它工作,我将不得不求助于它,但这并不理想。:(

4

3 回答 3

3

我不明白是什么促使你尝试以这种方式重新发明 List<T> 轮子,但要回答你的问题:我会在你的类的构造函数中添加一行“System.Diagnostics.Debugger.Break()” .

然后尝试在设计器中使用它,您会收到一个弹出窗口,询问您是否要附加调试器。附加 Visual Studio 的第二个实例作为调试器,您将能够在代码中设置一些断点并开始调试。

于 2008-09-21T15:54:18.210 回答
0

一个开始的地方是它可能正在使用您的 ListE`1::Count 属性进行数学运算。如果这有一些微妙的缺陷(即它比返回 this.innerList.Count 更复杂),它可能会导致设计者在某些操作上出现算术溢出。通常不会发生算术溢出,除非特别要求使用

checked
{
   // ...
}

句法。

于 2008-09-21T13:51:03.577 回答
0

您不必添加 Debugger.Break(); 调用你的代码来调试它。您可以打开一个不同的 VS 实例并附加到您使用它的那个实例上,您应该能够毫无问题地调试它(只要确保您已加载符号)。

于 2008-09-24T05:22:48.453 回答