C#编译器 - 未分配的DateTime字段和本地变量

时间:2017-09-10 17:50:32

标签: c# .net datetime compiler-errors

出于好奇:

此代码有效并执行:

public class Program
{
    private static DateTime date;

    public static void Main()
    {
        Console.WriteLine(date.ToString("o"));
    }
}

请参阅.NET Fiddle

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

public class Program
{
    public static void Main()
    {
        DateTime date;
        Console.WriteLine(date.ToString("o"));
    }
}

.NET Fiddle

上查看( not

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

这很有用,因为你很可能做错了(特别是如果有多条路径可以确定初始值),所以只需将其设置为默认值就可能隐藏错误。

答案 1 :(得分:1)

本地变量不会自动初始化,因此没有默认值。出于明确赋值检查的目的,局部变量最初被认为是未分配的。局部变量声明可以包括局部变量初始化器,在这种情况下,变量在整个范围内被认为是明确赋值的,除了在local-variable-initializer中提供的表达式之外。

在局部变量的范围内,在本地变量声明符之前的文本位置引用该局部变量是编译时错误。

来源: - https://msdn.microsoft.com/en-us/library/aa691170(v=vs.71).aspx

答案 2 :(得分:0)

  

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

不完全是。

来自docs

  

与类不同,可以在不使用new运算符的情况下实例化结构。在这种情况下,没有构造函数调用,这使得分配更有效。 但是,字段将保持未分配状态,并且在初始化所有字段之前无法使用该对象

请参阅“为什么编译器允许DateTime字段版本编译而不让本地变量版本编译?

的其他答案