当我在 Visual Studio 中生成一个以二维数组作为参数的构造函数时,这些星号是什么?

What are these asterisks when I generate a constructor with 2D arrays as parameters in Visual Studio?

在Visual Studio for Mac中,如果我这样写:

public class Foo {
    public int[,] Property1 { get; }

}

将光标放在那里的空行上,然后按 Command + I 生成一个构造函数:

发生这种情况:

public class Foo {
    public int[,] Property1 { get; }
    public Foo(int[*, *] property1)
    {
        Property1 = property1;
    }
}

生成了构造函数,但是参数的类型是int[*, *],编译不通过

我认为这是 Visual Studio 促使我写一些东西来替换那些星号,或者也许不是?因为这不会发生在一维数组中,而且我不知道 C# 中的任何语法允许您将内容放在 [] 中这样的地方。

对于三维数组,它生成 3 个星号:

public Foo(int[*, *, *] property1)
{
    Property1 = property1;
}

是什么导致 Visual Studio 这样做?

我的 Visual Studio 版本是:Visual Studio for Mac Community 7.2.2 (build 11).

我试图在 Visual Studio - Visual Studio Community 2015 的 Windows 版本上对此进行测试。但我找不到执行此操作的按钮。根据this answer,在"Quick Actions"中一个生成构造函数的按钮,但我没有找到。也许它不在社区版本中?

我不确定为什么 Mac 的 VS 会把这些星号放在那里,但我想你想删除它们。也许这是VS中的一个错误。以下代码对我有用。

public class Foo
{
    public int[,] Property1 { get; }
    public Foo(int[,] property1)
    {
        Property1 = property1;
    }
}

var myArray = new int[,] { { 1, 2 }, { 3, 4 } };
var foo = new Foo(myArray);
    int[*, *] property1

这是由 Visual Studio 错误引起的。奇怪的语法与不一致数组的外观相匹配。当数组的下限为 0 时,数组是一致的,并且 C# 支持其语法。C# 没有可用于不一致的数组类型的语法,因此怪人 [*,*] 及其生成的编译错误。

这通常只发生在 C# 中,当您与能够创建此类数组类型的外部类型系统互操作时。我只知道 COM 是一个实际示例,它能够发出可由 C# 程序直接使用的类型信息。注意 this existing question, another one here.

中的语法匹配

当然你的属性类型并不特殊。 VS 在 IDE 中集成的 Roslyn 代码中失去了它的弹珠。从事这项工作的团队在编写无错误测试代码方面没有良好的记录。我自己无法获得此重现,我使用的是版本 15.5.6 并且避免更新到 15.6.x 由于它生成的大量错误报告。它特定于 Mac 版本的可能性很小,OS 是 COM 挑战的。 VS2015 还没有这个功能,这就是为什么你找不到它的原因,ReSharper 是一个流行的商业替代品。

在 VS 内部使用“帮助”>“发送反馈”>“报告问题”来告诉他们有关错误的信息。我没有看到针对此缺陷的现有错误报告,至少在 developercommunity.visualstudio.com 中搜索 "generate constructor" 时没有匹配项。我不希望很多程序员 运行 关注这个错误或花时间报告它。解决方法很简单,只需将代码编辑为 int[,] property1.