原始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();
}
}
虽然前面5行代码可以从C#编译器视图中找到,但接下来的5行代码会生成编译错误:
使用未分配的局部变量
请解释原因?从我的观点来看,这两种类型都是结构,并且具有相同的行为。
答案 0 :(得分:8)
这是确定任务规则的病态极端。具体做法是:
如果结构类型变量的每个实例变量都被认为是明确赋值的,则它被认为是明确赋值的。
在这种情况下(STRCT strct
),实例变量集是空的,所以它们都是明确分配的。
答案 1 :(得分:4)
这是因为,与int
不同,您的STRCT
不包含任何字段,因此不包含任何可能“未分配”的内容。
尝试将其更改为:
struct STRCT
{
public int X;
}
然后你会得到相同的编译错误:
错误CS0165使用未分配的局部变量 'strct'ConsoleApplication1 D:\ Test \ CS6 \ ConsoleApplication1 \ Program.cs 15
C#语言规范在第5.3节中有“明确赋值”的明确规则:
在函数成员的可执行代码中的给定位置,如果编译器可以通过特定的静态流分析(第5.3.3节)证明该变量已被自动初始化,则称该变量是明确赋值的。或已成为至少一项任务的目标
然后:
如果结构类型变量的每个实例变量都被认为是明确赋值的,则它被认为是明确赋值的。
从最后一条规则开始,如果一个struct没有实例变量(即字段),那么它被认为是“明确赋值”,因此不会省略编译错误。
答案 2 :(得分:1)
自动初始化的班级成员 - 因此,如果您的int是某个字段中的字段或属性,那么您可以。
但是,方法的局部变量未初始化,并且希望您为它们提供值。
您的struct变量暂时可以正常工作,因为它不包含自己的成员。一旦你添加
struct STRCT
{
private int a;
}
你也会收到错误。
答案 3 :(得分:0)
Structs
是value types
与
reference types
不同,value type
不能包含空值。但是,可空类型功能允许将值类型分配给null。 每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。有关值类型的默认值的信息
请参阅 - https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx