使用组合框更改串行端口时,为什么会出现System.InvalidCastException? VB.NET 2019

时间:2019-04-12 22:05:46

标签: vb.net exception variable-assignment communication

我创建了一个变量作为新的串行端口,如下所示:

Public Shared panelComm As New SerialPort("COM3")

现在,当使用使用可用COM端口列表填充的组合框尝试更改端口号时,它总是给我这个例外:

System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'System.IO.Ports.SerialPort'.'

我要更改的代码是这样:

panelComm.Close()
panelComm = panelCOMdrp.SelectedItem
panelComm.Open()

panelComm是端口变量,而panelCOMdrp是具有端口列表的下拉组合框。

编辑:这是我用来填充该程序可用的串行端口列表的代码:

For Each sp As String In My.Computer.Ports.SerialPortNames
      panelCOMdrp.Items.Add(sp)
Next

1 个答案:

答案 0 :(得分:0)

如果您的组合存储了串行端口的名称,则每个Item是一个字符串,而不是SerialPort对象实例。这是错误消息的原因。您正在尝试将字符串分配给类型为SerialPort的变量。即使该字符串是SerialPort的有效名称,编译器也不会自动从该字符串创建SerialPort。

您需要明确并从该字符串创建SerialPort实例,因此您应该编写(就像声明变量时一样)

' Always check if a selection is present or not
if panelCOMdrp.SelectedItem IsNot Nothing Then
    panelComm = New SerialPort(panelCOMdrp.SelectedItem.ToString())
End If

在下面的注释中@nbk的观察是正确的,因为 SelectedItem 定义为 Object 类型。此定义以及 SerialPort 的构造函数都会引起问题。 SerialPort有许多重载,其中一个重载期望一个IContainer,而另一个重载则期望一个String。仅传递SelectedItem(一个Object)会强制编译器选择需要IContainer的构造函数,这会产生错误。只需添加ToString即可解决此问题,然后选择正确的构造函数。