【问题标题】:Parameterless constructor in Structure结构中的无参数构造函数
【发布时间】:2015-08-24 10:00:54
【问题描述】:

this questionVisual Studio 2015 中使用不同的 Visual Basic 版本之后,我正在运行 Visual Basic 14 中的新语言功能,如 herehere 所述。

其中之一是在结构中具有无参数构造函数的能力,如下所示:

Structure MyStruct1
   Public f As Integer
   Sub New()
      f = 15
   End Sub
End Structure

当我在 Visual Studio 2015 的代码中尝试此操作时,New() 下仍然出现红色错误曲线:

BC30629 结构不能在没有参数的情况下声明非共享的“Sub New”。

我还没有看到任何地方表明这是在发布之前被取消的。

我是否误解了这项新功能的作用?

【问题讨论】:

  • 我没有答案,但是我可以确认它在 VS 2015(社区)中不起作用,与目标框架无关。 (所以与具体安装无关)。我也很好奇。
  • 你试过公开构造函数吗?我认为这可能是一个要求。
  • @ChrisDunaway:没有区别。 FWIW,上面给出的示例与链接的文档页面之一完全相同。
  • 我不确定。我记得看到一些关于 C# struct 构造函数需要公开的东西,我想知道 VB 是否也一样。

标签: vb.net visual-studio-2015


【解决方案1】:

正如您在下面引用的文本中所见,Roslyn 删除了对具有无参数构造函数的结构的支持,因此它列为new feature in VB 14

C# 和 VB 结构一直是一个长期存在的要求 构造函数总是有参数。我们试图放松这一点 C#6.0 中的要求,以使结构与类更加一致。

虽然结构中的整体无参数构造函数在 IL 中是有效的 透视,没有一种方便的方式来声明它们是 几乎不存在。随着我们进行越来越多的测试,我们保持 发现无参数结构构造函数导致的情况 库甚至某些版本的 CLR 中的行为不一致。

CodePlex 错误http://roslyn.codeplex.com/workitem/465 中报告的问题就是一个很好的例子。这个问题基本上是 在 CLR 4.0 和 Activator.CreateInstance 中引入的优化和 从那时起就一直存在。优化假设无参数 如果 T 是泛型 T 类型的实例化不会引起副作用 发现是一个结构,因此可以缓存实例。 无参数结构构造函数会违反这样的假设并且 使优化可观察,因此需要维护现有的 编码几个版本。

重新考虑断多可能带来的问题后 常设假设,我们认为最好让我们的用户恢复 结构构造函数的要求总是有正式的 参数。


来源:Restore requirement for struct constructors to always have formal parameters. #1029

【讨论】:

  • 很遗憾,特定的 Roslyn wiki 页面没有出现在搜索结果中(例如,对于 VB 14 或 VB 2015) - 这样做的是链接到 out- 的博客文章最新列表。
  • 它只提到了 C# (6.0)。 VB.NET 是否也发生了变化?还是只在 C# 中尝试过?
【解决方案2】:

您需要在 VB.Net 中为无参数构造函数使用共享关键字(充当静态)。

试试下面的代码:

Structure MyStruct1
   Public Shared f As Integer
   Shared Sub New()
      f = 15
   End Sub
End Structure
Class My_Class
    Public Shared Sub Main()
        Dim str1 As New MyStruct1()
    End Sub
End Class

注意:Shared 关键字在这里充当静态。在使用Shared Constructor 时,您需要访问Shared 变量,这就是我使用Shared 关键字声明变量的原因。

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 2017-10-02
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2011-10-08
    相关资源
    最近更新 更多