无法转换对象类型’System.String ‘以键入’System.String ‘
大家好,我有一个C#.NET代码的问题,我使用DLL连接OPC服务器在VB.NET项目中使用的DLL并没有任何问题。
我试图在ListBox中显示可用服务器的列表,VB.NET中使用的代码(和工作)是这样的:
Dim AllOPCServers As Object AllOPCServers = AnOPCServer.GetOPCServers ' Load the list returned into the List box for user selection Dim i As Short For i = LBound(AllOPCServers) To UBound(AllOPCServers) AvailableOPCServerList.Items.Add(AllOPCServers(i)) Next i
我写这个在C#应用程序中使用
try { var _listOPCServer = _OPCServer.GetOPCServers(); foreach(var i in _listOPCServer) { string serverName = (string)i; listServers.Items.Add(serverName); } } catch (Exception exc) { lstMsg.Items.Add(DateTime.Now + " Error al Obtener Lista de OPC's: " + exc.Message); }
在Local选项卡上的Debug模式下显示:
_listOPCServer | {string [1..2]} | dynamic {string []} |
[1] | "Server01" | string [2] | "Server02" | string
更新:
我得到的错误是“foreach(var i in _listOPCServer )”
无法转换对象类型’System.String [*]’以键入’System.String []’
那是实际的错误。
我确定我做错了什么,有人能帮帮我吗?
好的,我找到了解决这个问题的方法,它只是你建议的一个模式
Array _listOPCServer = (Array)(object)_OPCServer.GetOPCServers(); foreach(object i in _listOPCServer) { string serverName = (string)i; listServers.Items.Add(serverName); }
我只在声明中添加了(对象)并且工作正常,现在我可以按照我想要的方式显示服务器列表
或者也这样做
Array _listOPCServer = (Array)(object)_OPCServer.GetOPCServers(); foreach(object i in _listOPCServer) { listServers.Items.Add(i); }
再次,非常感谢您的帮助和时间!
VB.NET在处理不符合数组的类型时非常精明。 不要犹豫使用它,.NET可以让语言相互交互变得容易。
问题在于OPC是基于COM的标准。 你正在使用的服务器是返回一个不符合下限的SAFEARRAY,第一个索引是1.不是0.在COM中不常见,在0和1之间选择,因为第一个数组索引就像是字节序问题或争论是否番茄是水果或蔬菜(它是一种水果。而小端是正确的蔬菜)。
但是,0作为下限是C#在处理一维数组时所坚持的。 它需要一个“向量”,一个独特的数组类型,它始终具有一个维度,其下限为0.在.NET运行时中进行了大量优化。 你得到的东西不匹配,所以映射到一维的多维数组。 不是您可以用C#语言表达的数组类型。
你可以在C#中破解它,但你必须明确地使用Array类型。 这样的东西,为清楚起见,拼写清楚:
Array servers = (Array)_OPCServer.GetOPCServers(); int first = servers.GetLowerBound(0); int last = servers.GetUpperBound(0); for (int ix = first; ix <= last; ++ix) { var elem = (string)servers.GetValue(ix); // etc.. }
汉斯在区分零基数组和基于非零数组之间的区别方面是正确的,但我仍然不明白为什么你会得到那个例外。
我的猜测是你将_OPCServer
声明为dynamic
,它将类型绑定推迟到运行时。 因此_listOPCServer
也是dynamic
。
由于您在迭代数组并提取string
s,编译器可能正在尝试将对象强制转换为string[]
,而Hans指出该string[]
无效。
您应该能够将_listOPCServer
转换为Array
, _listOPCServer
使用foreach
:
Array _listOPCServer = (Array)(_OPCServer.GetOPCServers()); foreach(var i in _listOPCServer) { // etc.