VB.NET For each枚举不正确

VB.NET For each枚举不正确,vb.net,visual-studio-2012,foreach,Vb.net,Visual Studio 2012,Foreach,我有以下代码: For Each t As TabPage In Me.TabControl1.TabPages For Each p As Panel In t.Controls Dim sText As String = p.Name If modStrings.Has(sText, u) Then m_PrevPanel = p p.Parent = Me

我有以下代码:

    For Each t As TabPage In Me.TabControl1.TabPages
        For Each p As Panel In t.Controls
            Dim sText As String = p.Name
            If modStrings.Has(sText, u) Then
                m_PrevPanel = p
                p.Parent = Me.pnlMain
                Return
            End If
        Next
    Next
但有时是排队

 For Each p as Panel in t.Controls
我得到了错误

“无法将SystemWindows.Forms.Button类型的对象强制转换为System.Windows.Forms.Panel”

我不明白为什么它会尝试在“p as Panel”枚举中包含一个按钮。
有人看到这里可能出了什么问题吗?

因为您在TabPage控件集合上有一个按钮

尝试过滤它:

For Each p As Panel In t.Controls.OfType(Of Panel)()

Next

枚举没有如您所怀疑的那样工作。这一行:

For Each p As Panel In t.Controls
不会仅按面板对象过滤控件,它会返回所有控件并尝试将它们强制为面板类型-一旦找到非面板的控件,就会失败

您只需进行额外检查,以确保控件是一个面板

    For Each ctl As Control In Me.Controls
        If ctl.GetType() Is GetType(Panel) Then
            Dim p As Panel = CType(ctl, Panel)

        End If
    Next

老实说,如果编译器选择了这一点会很好,因为这可能是一个常见的运行时错误

在循环中进行过滤不是比枚举每个循环并检查类型更快吗?速度可能是可以忽略的,但我想更有效的方法是,我的意思是说,简单、糟糕的词语选择是有效的。linq查询将(我相信)仍然枚举所有控件,但只返回那些符合指定标准的控件,因此我怀疑效率可以忽略不计,同时可读性和代码维护是两个不同的因素