繁体   English   中英

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

[英]Use of unassigned local variable: value type vs custom 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();
    }
}

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

使用未分配的局部变量

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

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

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

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

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

尝试将其更改为:

struct STRCT
{
    public int X;
}

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

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

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

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

接着:

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

所以从最后一条规则来看,如果一个struct没有实例变量(即字段),那么它被认为是“明确赋值”,因此不会省略编译错误。

它是自动初始化的类成员 - 所以如果你的int是一个字段或类中的属性,你就没问题。

但是, 方法的局部变量未初始化,并且希望您为它们赋值。

您的struct变量暂时可以正常工作,因为它不包含自己的成员。 一旦你添加

struct STRCT
{
    private int a;
}

你也会得到一个错误。

Structsvalue types

reference typesvalue type不能包含空值。 但是,可空类型功能允许将值类型分配给null。 每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。 有关值类型的默认值的信息

请参阅 - https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM