代码之家  ›  专栏  ›  技术社区  ›  Sweeper

在Visual Studio中生成以2D数组作为参数的构造函数时,这些星号是什么?

  •  4
  • Sweeper  · 技术社区  · 8 年前

    在Visual Studio for Mac中,如果我写了以下内容:

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

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

    enter image description here

    这种情况会发生:

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

    已生成构造函数,但参数类型的类型为 int[*, *] ,它不编译。

    enter image description here

    我在想,这是Visual Studio促使我写一些东西来替换那些星号,或者可能不是?因为这在一维数组中不会发生,而且我不知道C语言中有任何语法允许您将内容放入 []

    对于三维阵列,它会生成3个星号:

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

    是什么导致Visual Studio执行此操作?

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

    我尝试在Windows版本的Visual Studio-Visual Studio Community 2015上对此进行测试。但我找不到一个按钮可以这样做。根据 this answer 那里 “快速操作”中的“生成构造函数”按钮,但我找不到。也许它不在社区版本中?

    2 回复  |  直到 8 年前
        1
  •  7
  •   Hans Passant    8 年前
        int[*, *] property1
    

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

    通常只有在与能够创建此类数组类型的外部类型系统进行互操作时,才会在C#中发生这种情况。我只知道COM是一个实用的例子,它能够发出C#程序可以直接使用的类型信息。注意中的语法匹配 this existing question ,另一个 here .

    当然,你的财产类型并不特殊。VS在集成在IDE中的Roslyn代码中正在失去其魅力。从事此工作的团队在编写无bug测试代码方面没有良好的记录。我自己无法获得复制,我使用的是15.5.6版,并且避免了更新到15.6版。x,因为它生成了大量的bug报告。很有可能它是针对Mac版的,但操作系统受到COM的挑战。VS2015还没有这个功能,这就是为什么你找不到它的原因,ReSharper是一个流行的商业替代品。

    内部VS使用帮助>发送反馈(>);报告问题以告诉他们有关错误的信息。我没有看到关于此缺陷的现有错误报告,至少在搜索developercommunity时没有匹配的错误报告。visualstudio。com表示“生成构造函数”。我不认为有多少程序员会遇到这个bug或花时间报告它。解决方法很简单,只需将代码编辑为 int[,] property1 .

        2
  •  1
  •   asherber    8 年前

    我不知道为什么VS for Mac会把这些星号放在那里,但我想你应该删除它们。也许这是VS中的一个bug。下面的代码对我有用。

    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);