"使用未分配的变量" - 解决方法?

Ear*_*rlz 4 .net c# struct compiler-errors

现在我早就知道并且习惯于在C#中使用这种行为,而且一般来说,我喜欢它.但有时编译器不够聪明.

我有一小段代码,现在我的解决方法不是一个大问题,但它可能在类似的情况下.

        bool gap=false;
        DateTime start; // = new DateTime();
        for (int i = 0; i < totaldays; i++)
        {
            if (gap)
            {
                if (list[i])
                {
                    var whgap = new WorkHistoryGap();
                    whgap.From = start; //unassigned variable error
                    whgap.To = dtFrom.AddDays(i);
                    return whgap;
                }
            }
            else
            {
                gap = true;
                start = dtFrom.AddDays(i);
            }
        }
Run Code Online (Sandbox Code Playgroud)

我看到的问题是,如果你有一个非空的结构不具有默认构造函数来做到这一点呢?如果start不是一个简单的DateTime对象,还是可以解决这个问题吗?

Eri*_*ert 10

有时编译器不够智能

您希望编译器解决的问题等同于暂停问题.由于计算机程序无法解决该问题,因此我们只做了最小的尝试来解决它.我们没有做任何特别复杂的事情.你只需要忍受它.

有关为什么程序分析等同于暂停问题的更多信息,请参阅有关推断方法的终点是否可达的主题的文章.这与确定变量是否明确分配的问题基本相同; 分析非常相似.

http://blogs.msdn.com/b/ericlippert/archive/2011/02/24/never-say-never-part-two.aspx

如果你不得不用一个没有默认构造函数的非可空结构来做这件事怎么办?

没有这样的动物.所有结构,可以为空或以其他方式具有默认构造函数.

如果start不是一个简单的DateTime对象,还是可以解决这个问题吗?

表达式default(T)为您提供任何类型T的默认值.您可以随时说

Foo f = default(Foo);
Run Code Online (Sandbox Code Playgroud)

并有法律任务.如果Foo是值类型,则它调用默认构造函数,该构造函数始终存在.如果它是引用类型,那么您将获得null.


Ran*_*pho 6

DateTime由于您的gap变量,编译器无法知道您可以保证设置.

只是用

DateTime start = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

并完成它.

编辑更好,第二眼看看您的代码,使用

DateTime start = dtFrom;
Run Code Online (Sandbox Code Playgroud)