【问题标题】:What does int[*] mean in C# under Visual studio 2017Visual Studio 2017下C#中的int[*]是什么意思
【发布时间】:2018-10-22 09:05:34
【问题描述】:

我们使用第三方 dll,它公开了一个取出 NetworkStream.Data[] 参数的方法:

public void Read(int elementsCount, int timeOutInMs, out Data[] array, out bool timedOut)

我们通过传入 NetworkStream.Data(在所述库中定义的数据类型)数组在代码中使用它,它在 Visual Studio 2012 下编译良好。

但是,在 Visual Studio 2017 下编译时,会产生转换错误:

错误 CS1503 参数 4:无法将 'out NetworkStream.Data[]' 转换为 'out NetworkStream.Data[*]'

诸如 DnSpy 之类的反编译器确实在方法的工具提示中指出了相同的内容,而在 IL 中它显示了参数是

[out] valuetype NetworkStream.Data[0...]& data

这个 NetworkStream.Data[*] 或 NetworkStream.Data[0...] 是什么意思,为什么在 VS 2017 中转换失败?

【问题讨论】:

  • 好像和this有关,不过我自己没有这方面的经验,所以我会留给你判断它是否有用。
  • 似乎var 声明可以获取非零基数组类型的属性,即使 C# 不允许拼写它。

标签: c# visual-studio-2017


【解决方案1】:

表示数组有一个或多个不为零的下界。

例如这段代码:

Array test = Array.CreateInstance(typeof(int), new[] { 2 }, new[] { 2 });
Console.WriteLine(test.GetType().FullName);

打印System.Int32[*]

【讨论】:

  • 好的,这就是我收集到的。现在我的问题是,是否可以在 C# 中定义这样一个数组,以便我可以实际调用一个需要这样一个数组的方法,特别是因为它是一个输出参数,所以我需要定义一个该类型的变量来填充被调用的方法。
  • @DenisTroller 您可能需要将参数类型声明为Array
  • @MatthewWatson 问题是out参数变量类型必须完全匹配。
  • OP 需要联系第 3 方 DLL 的供应商,询问如何调用它,我想。这里有问题。
  • @DennisTroller 没关系,我已经大致回答了我自己的问题:LabVIEW 2015 不起作用,LabVIEW 2017 可以。如果您查看 LabVIEW 构建生成的 xml 文件,参数在 LabVIEW 2015 中定义为 string[*],但在 2017 中定义为纯字符串 [],这当然是正确的,因为 LabVIEW 具有零索引数组。
【解决方案2】:

这是一个具有非默认下限的数组,see documentation 说明如何处理。

【讨论】:

  • 您提供的链接中没有提及“非默认下限”“[*]”或“[0..”]。此外,通常不鼓励仅链接答案 - 尝试将答案包含在答案本身中,并将链接用作 reference
猜你喜欢
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多