使用未分配的局部变量:值类型与自定义结构

zzf*_*ima 4 c# struct

原始C#值类型,例如int是结构.那么,为什么int没有初始化?我认为应该有默认构造函数.另一方面,自定义结构是可以的.

在以下代码中

struct STRCT { }
class Program
{
    static void Main(string[] args)
    {
        STRCT strct;
        strct.Equals(8);
        strct.GetHashCode();
        strct.GetType();
        strct.ToString();

        int i;
        i.Equals(8);
        i.GetHashCode();
        i.GetType();
        i.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

从C#编译器视图中可以看到前5行代码,接下来的5行代码会生成编译错误:

使用未分配的局部变量

请解释原因?从我的观点来看,这两种类型都是结构,并且具有相同的行为.

Dam*_*ver 8

这是定义任务规则的病态极端.特别:

如果结构类型变量的每个实例变量都被认为是明确赋值的,则它被认为是明确赋值的.

在这种情况下(STRCT strct),实例变量集是空的,所以它们都是明确分配的.


Mat*_*son 5

这是因为,与 不同int, yourSTRCT不包含任何字段,因此不包含任何可能“未分配”的内容。

尝试将其更改为:

struct STRCT
{
    public int X;
}
Run Code Online (Sandbox Code Playgroud)

然后你会得到同样的编译错误:

错误 CS0165 使用未分配的局部变量 'strct' ConsoleApplication1 D:\Test\CS6\ConsoleApplication1\Program.cs 15

C# 语言规范在 5.3 节中对“定义赋值”有明确的规则:

在函数成员的可执行代码中的给定位置,如果编译器可以通过特定的静态流分析(第 5.3.3 节)证明该变量已被自动初始化或已至少一项任务的目标

进而:

如果一个结构类型变量的每个实例变量都被认为是明确赋值的,那么它就被认为是明确赋值的。

所以根据最后一条规则,如果一个结构体没有实例变量(即字段),那么它被认为是“明确分配的”,因此不会忽略任何编译错误。