根据《坚果壳中的C#12》一书:

在C#11之前, struct 中的每个字段都必须显式分配 在构造函数(或字段初始化器)中.这一限制现已 很放松.

然而这:

using System;

Point point = new Point();
Console.WriteLine(point.X);

struct Point
{
    public int X;
    public int Y;
}

当使用.NET 5(如果我理解正确的话,它是C#9)编译时,会编译和运行(返回0)?资料来源:https://dotnet.microsoft.com/en-us/download/dotnet/5.0).

MRE:https://dotnetfiddle.net/K6cu5z.

推荐答案

您编写的代码一直很好-您正在调用无参数构造函数,该构造函数将所有字段分配为其默认值.

如果您将代码更改为:

Point point;
Console.WriteLine(point.X); // Error

...那么您就会看到错误.

请注意,如果您完全初始化它--而从未调用new --那就没问题:

Point point;
point.X = 10;
point.Y = 20;
Console.WriteLine(point.X); // Fine

但就这本书的文本而言,如果它说:"每个字段都必须在构造器(或字段初始化器)中显式分配",那么这并不能说明您的代码是anything,因为您没有声明任何构造器.

这是一个实际证明该规则的例子:

struct Point
{
    public int X;
    public int Y;

    public Point(int x)
    {
        X = x;
        // Error before C# 11: Y isn't assigned
    }
}

如果您使用<LangVersion>10</LangVersion>构建它,您会收到错误;使用<LangVersion>11</LangVersion>,它就会构建.

Csharp相关问答推荐

VB.Net的SON模式导致集合代码不工作

当MD5被废弃时,如何在Blazor WASM中使用它?

是否可以将gltf转换为字节数组,然后将字节数组转换回文件?

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

自定义JsonEditor,用于将SON序列化为抽象类

为什么这个Reflection. Emit代码会导致一个DDL ViolationException?

使用客户端密钥为Fabric Rest API生成令牌

如何使用while循环实现异常处理

在具有主构造函数的类中初始化属性时出现警告

为什么任务需要在内部使用ManualResetEventSlim?

取决于您的数据量的多个嵌套循环

在.NET 7.0 API控制器项目中通过继承和显式调用基类使用依赖项注入

C#自定义验证属性未触发IsValid方法

GODOT 4向C#中的字符串参数发送信号以等待

在PostgreSQL上使用ExecuteSqlRawAsync的C#11原始字符串文字有区分大小写的问题

Azure函数-在外部启动类中生成配置时出错

为什么C#/MSBuild会自发地为不同的项目使用不同的输出路径?

我应该为C#12中的主构造函数参数创建私有属性吗?

如何在单击按钮后多次异步更新标签

如何阻止可传递依赖项出现在项目中