Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在VS2008中调试设计器处理_.net_Winforms_Visual Studio 2008_Designer - Fatal编程技术网

.net 在VS2008中调试设计器处理

.net 在VS2008中调试设计器处理,.net,winforms,visual-studio-2008,designer,.net,Winforms,Visual Studio 2008,Designer,我有一个公共属性集,其类型为ListE,其中: public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 公共类列表:IList、ICollection、IEnumerable、IList、ICollection、IEnumerable 是的,这很有意思,但这正是设计师要求它在属性窗口中显示为可编辑集合的要求

我有一个公共属性集,其类型为
ListE
,其中:

public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
公共类列表:IList、ICollection、IEnumerable、IList、ICollection、IEnumerable
是的,这很有意思,但这正是设计师要求它在属性窗口中显示为可编辑集合的要求。确实如此!因此,我单击小[…]按钮编辑集合,然后单击“添加”向集合添加项目

算术运算导致溢出

现在,这是一个非常基本的列表,只不过是一个扩展数组。在整个过程中,唯一接近算术的部分是扩展函数,甚至它使用左移位而不是乘法,这样就不会溢出。这一切让我觉得这个异常是在设计器中提出的,可能是由于我对实现细节的一些小疏忽造成的,但我找不到一种方法来测试或调试该场景。有人有什么聪明的想法吗


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

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

checked
{
   // ...
}

语法。

我不明白是什么促使您尝试以这种方式重新创建列表轮,但为了回答您的问题:我将在类的构造函数中添加一行“System.Diagnostics.Debugger.Break()”


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

您不必添加调试器。Break();调用您的代码进行调试。您只需打开另一个VS实例并附加到使用它的实例,就可以调试它而不会出现任何问题(只需确保已加载符号).

这与您的问题无关,但请注意,您只能指定ListE实现IList。我不想打断您,但标准库中的列表具有完全相同的签名。如果您选择键入“List”在VS中按F12键,它将带您进入一个重新构造的定义。事实上,IList本身实现了其他通用接口以及IEnumerable,因此我可以将其简化为ListE:IList,IList,但这种方式更显式。我的Count属性很简单:public int Count{get{return maxIndex+1;}其中_maxIndex是数组中的最后一个元素。我也肯定没有任何检查过的{}代码,所以这只能证明它发生在设计器中的某个地方,不是吗?@monitor:可能是你的_maxIndex+1溢出了,或者他们使用你的_maxIndex+1的方式(假设它是Int32.MaxValue)溢出。最重要的是,我不完全确定您如何调试它。Joe解决了如何调试它,至于溢出的是什么,在我的扩展方法中是_list.GetUpperBound(0)*2。不知怎的,(受保护的)列表被设计器设置为零长度数组。最好的猜测是,它试图计算((uint)-1)*2.重新实现控制盘可能很有趣。也没有多态性的方法来扩展任何基本集合以包含事件,因为定义的函数都不可重写,因此如果我将其转换回原始类,我就不会再得到任何事件。此外,除此之外,它还尝试使用CopyTo()由于某种原因,我没有实现它。首先修复它,然后看看我们从那里走到哪里。。。