为什么在空的用户定义的结构上没有"使用未分配的局部变量"编译错误?

Zai*_*sud 7 c#

以下编译成功:

struct Foo {}

void Test()
{
    Foo foo;
    foo.ToString();
}
Run Code Online (Sandbox Code Playgroud)

以下产生"使用未分配的局部变量"编译错误.

struct Foo
{
    int i;
}

void Test()
{
    Foo foo;
    foo.ToString();
}
Run Code Online (Sandbox Code Playgroud)

看起来在第一种情况下,编译器做了某种推断,因为结构没有成员,所以不需要初始化它们.但我不确定这对我有意义.编译器可能强制您将foo变量初始化为new Foo().

因此,如果在C#中所有局部变量必须在访问之前初始化,为什么第一个示例编译

Jon*_*eet 7

C#5规范的第5.3节涵盖了这一点:

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

当没有实例变量时,这是自动的情况,因此该变量被认为是明确分配的,并且可以在ToString()调用中使用.