【问题标题】:Parameterless constructors in structs for C# 6C# 6 结构中的无参数构造函数
【发布时间】:2015-09-12 19:31:04
【问题描述】:

我的理解是现在允许结构中的无参数构造函数。

但以下在 VS 2015 社区中给了我一个编译错误

public struct Person 
{ 
    public string Name { get; } 
    public int Age { get; } 
    public Person(string name, int age) { Name = name; Age = age; } 
    public Person() : this("Jane Doe", 37) { } 
}

错误:“结构不能包含显式无参数构造函数”

有人知道为什么吗?

【问题讨论】:

标签: c# c#-6.0


【解决方案1】:

该功能出现在 C# 6.0 的较早预览版中,这就是为什么一些文章谈论它的原因。但它随后被删除,因此它不存在于随 VS 2015 RC 分发的版本中。

具体来说,pull request #1106 中的更改已恢复,issue #1029 中提供了有关基本原理的更多信息。引用弗拉基米尔·萨多夫的话:

随着我们进行越来越多的测试,我们不断发现无参数结构构造函数导致库甚至某些版本的 CLR 行为不一致的情况。

[…]

在重新考虑因打破长期假设而产生的潜在问题后,我们决定最好让我们的用户恢复对结构构造函数始终具有形式参数的要求。

The feature was then added back in C# 10.0.

【讨论】:

  • 有趣:虽然该功能已从 C# 中删除,但仍保留在 vb.net 中并且可以在那里使用。转换为 VB 的 OP 代码示例(所有构造函数的名称为 New )将起作用。
  • 哦,我明白了,虽然没有明确说明,但此问答仅讨论 非静态 问题。静态无参数 struct 构造函数可在 C# 和 VB 中使用。 (经过测试。)
  • 如果我错了,请纠正我。结构的参数化构造函数仍然调用默认的无参数构造函数(他为 FCL 中的结构预定义)作为其执行的第一件事。我相信实现这种行为涉及到一个编译器技巧。
  • @RBT 不,它没有。首先,用 C# 6.0 编写的结构不能有无参数构造函数。如果您的意思是参数化构造函数首先将所有字段初始化为默认值,那也不正确,如果您愿意,您必须显式添加: this()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2013-12-24
  • 2017-10-02
  • 2010-10-06
相关资源
最近更新 更多