C#编译器-未分配的字段和局部变量初始值

Mur*_*lex 5 .net c# datetime compiler-errors compilation

出于好奇:

此代码有效并执行:

public class Program
{
    private static DateTime date;

    public static void Main()
    {
        Console.WriteLine(date.ToString("o"));
    }
}
Run Code Online (Sandbox Code Playgroud)

看到它在.NET Fiddle上工作

但这甚至不编译(未分配的局部变量):

public class Program
{
    public static void Main()
    {
        DateTime date;
        Console.WriteLine(date.ToString("o"));
    }
}
Run Code Online (Sandbox Code Playgroud)

看到它(不是)在.NET Fiddle上工作

DateTime是不可为空的值类型,因此不需要将其分配和初始化为具有值,它具有默认值。

那么,为什么编译器允许DateTime字段版本进行编译,而不让本地变量版本进行编译?当代码被编译为IL时,是什么阻止了使用值类型的局部变量?

Jon*_*nna 4

没有显式初始化的字段会自动初始化为默认值。

这很有用,因为它是一个非常常见的初始值,因此可以节省时间。

没有初始化的本地处于无法使用的状态。

这很有用,因为您很可能做错了什么(特别是如果有多个路径确定初始值),因此仅将其设置为默认值可能会隐藏错误。