当我在 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
.
在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
.