System.String[*] 和 System.String[] 在 C# 中的区别

6

编辑: 我知道 For Each server As String In servers 的 C# 等价语句是 foreach(var item in servers),但由于 GetOPCServers 返回的是一个对象,它应该被转换为可迭代类型。


我正在使用COM库开发一个应用程序。由于64位引起了问题,所以我的目标CPU是x86。

除了GetOPCServers()之外,所有方法都按预期工作。

虽然使用相同的dll的Visual Basic代码没有问题,但C#会抛出System.InvalidCastException,并显示如下错误:

在System.Core.dll中发生了类型为'System.InvalidCastException'的一次首次机会异常

附加信息:
无法将类型为'System.String[*]'的对象分配给类型为'System.String[]'的对象。

对于错误消息,请原谅,因为我的操作系统是土耳其语。

类型为System.String[*]的对象无法被赋值System.String[]

System.String[*]System.String[]之间有什么区别?

使用相同dll的VB代码可以正常运行,没有任何异常。

Public Class OpcInfo
  Dim servers As VariantType
  Dim server As OPCAutomation.OPCServer = New OPCAutomation.OPCServer()

  Function GetServers()
    Dim servers As Object
    Dim _servers As New List(Of String)

    servers = server.GetOPCServers()

    For Each server As String In servers
      _servers.Add(server)
    Next
    Return _servers
  End Function
End Class

但是 C# 代码也使用相同的 DLL 抛出异常

static void Main(string[] args)
{
    var opc_servers = new OPCAutomation.OPCServer().GetOPCServers();
    foreach (var item in (string[])opc_servers)
    {
        Console.WriteLine(item);
    }
}

更有趣的是,我能够在观察/立即窗口中查看数据:

watch window

错误代码-2147467262对应于FFFFFFFF80004002,根据https://technet.microsoft.com/zh-cn/library/bb632794.aspx的解释。

E_NOINTERFACE 
FFFFFFFF80004002
-2147467262
No such interface supported

3
你看过这个吗? - Pikoh
C#代码中等价于VB代码的是foreach (string item in opc_servers) - Alessandro D'Andria
谢谢。但是它也会抛出异常,因为GetOPCServers返回的是object - guneysus
1
foreach (var item in opc_servers) 是什么意思? - Pikoh
在循环内部进行强制类型转换,使用(string)item或者item as string更为合适。 - Alessandro D'Andria
2
它返回一个不符合规范的数组,在COM中非常常见。通常是因为数组的下限不是0,1是下一个常见的选择。将其转换为(Array)并使用Array.GetLower/UpperBound()和Array.GetValue()。 - Hans Passant
1个回答

2

谢谢大家。

在循环内部进行投掷并不能解决问题。

正如@pikoh在 C#中的MS Word自动化上所述的答案解决了问题:

而且var opc_servers = ...没有起作用。必须是object opc_servers = ...

object opc_servers = new OPCAutomation.OPCServer().GetOPCServers();
var servers = ((Array)(opc_servers));


for (int i = 1; i <= servers.Length; i++)
{
    Console.WriteLine((string)servers.GetValue(i));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接