Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#编译器-未赋值字段和局部变量初始值_C#_.net_Datetime_Compiler Errors_Compilation - Fatal编程技术网

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

C#编译器-未赋值字段和局部变量初始值,c#,.net,datetime,compiler-errors,compilation,C#,.net,Datetime,Compiler Errors,Compilation,出于好奇: 此代码有效并执行: public class Program { private static DateTime date; public static void Main() { Console.WriteLine(date.ToString("o")); } } 看到它在工作吗 但它甚至不编译(未分配的局部变量): 看到它(不)工作了吗 DateTime是一种不可为空的值类型,因此不需要为其赋值和初始化,它有一个默认值 那么为什

出于好奇:

此代码有效并执行:

public class Program
{
    private static DateTime date;

    public static void Main()
    {
        Console.WriteLine(date.ToString("o"));
    }
}
看到它在工作吗

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

看到它(不)工作了吗

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


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

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

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

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


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

局部变量不会自动初始化,因此没有默认值。为了确定赋值检查,局部变量被认为是初始未赋值的。局部变量声明可能包括局部变量初始值设定项,在这种情况下,除了在局部变量初始值设定项中提供的表达式内,变量被视为在其整个范围内明确赋值

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

资料来源:

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

不完全是

从:

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


请参阅“为什么编译器允许DateTime字段版本编译而不允许本地变量版本编译?”的其他答案。

可能取决于变量所在的位置、堆栈与可能的副本
public class Program
{
    public static void Main()
    {
        DateTime date;
        Console.WriteLine(date.ToString("o"));
    }
}