C# 可变语境问题

C# 可变语境问题,c#,datacontext,C#,Datacontext,在下面的代码段中,如果我省略了由////包围的代码行,则会出现一个错误:“使用未分配的局部变量CurrentDate”。对我来说,给CurrentDate一个任意的值似乎有点傻,有没有更好的方法 DateTime CurrentDate; /////////////////////////// CurrentDate = DateTime.Now; /////////////////////////// if(1==1) { CurrentDate = DateTime.Now.AddDay

在下面的代码段中,如果我省略了由////包围的代码行,则会出现一个错误:“使用未分配的局部变量CurrentDate”。对我来说,给CurrentDate一个任意的值似乎有点傻,有没有更好的方法

DateTime CurrentDate;

///////////////////////////
CurrentDate = DateTime.Now;
///////////////////////////

if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}

if(CurrentDate == DateTime.Now)
{
...
}
如果(1==1)不执行

说真的,如果编译器给你这个错误,通常是因为你的代码错了,或者是因为它太复杂了,可以用另一种方式更好地表达出来,你不需要访问可能未赋值的变量

你能想出一个现实世界的例子吗?在这个例子中,你得到了这个错误,而通过简单的重构并没有一个明显的解决方案?这会让你的问题更容易回答

话虽如此,如果您确实遇到上述情况之一,您可以使用以下几种其他方法:

DateTime CurrentDate = DateTime.MaxValue;
DateTime CurrentDate = default(DateTime);
DateTime? CurrentDate = null;
我喜欢最后一个选项,因为它表达了你的意思——你不知道它的价值。不过,这会使代码更加冗长,因为每当您希望访问某个值时,都会有额外级别的重定向。您可以使用键入的时间<代码> .Value<代码>来考虑您是否正确地处理了它可能为null的情况。 另外:您是否考虑过
DateTime.Now
的值在第一次和第二次调用之间可能会发生变化?如果
语句看起来无法达到您的预期效果,则最后的

您可以这样做:

DateTime CurrentDate;


if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}
else
{
///////////////////////////
CurrentDate = DateTime.Now;
///////////////////////////
}

if(CurrentDate == DateTime.Now)
{
...
}
这将消除编译器错误

注:在VS2008中,此将编译:

if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}
//else
//{
/////////////////////////////
//CurrentDate = DateTime.Now;
/////////////////////////////
//}

if(CurrentDate == DateTime.Now)
{
//
}

为什么不直接分配呢

DateTime CurrentDate =  DateTime.Now; 

这个例子有点复杂,但是,没有更好的方法

您必须为条件块中的变量标题指定一个值,即使您确信该块将始终执行(示例中的1=1)


但是,我建议不要使用DateTime。现在作为初始化值,因为它通过一些mirracle,块不会执行,这种情况应该很容易检测到,和DateTime。现在听起来比DateTime更真实。MinValue

我总是将我的对象设置为null,以便在未创建值时抛出null引用异常。然而,正如Hans指出的,null在这种情况下不起作用,因为微软凭借其无穷的智慧决定使DateTime不可为null。因此,我通常使用DateTime.MinValue,因为它给了我一个要检查的特定值,而不是时间旅行,它将始终是过去的,而不像DateTime.MaxValue,它将在这里为一些古老的32位窥视显示

范例

DateTime CurrentDate;

///////////////////////////
CurrentDate = DateTime.MinValue;
///////////////////////////

if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}

if(CurrentDate == DateTime.Now)
{
...
}

if(1==1)使得使用else块看起来很愚蠢,但这就是C#编译器的工作方式,伙计+注意到问题中的代码是编译的,至少在VS2008中是这样。我想知道他在用什么编译器。。。我问了一个澄清的问题。提示:先编译,后发布。好的观点是,Hans,用我通常使用的datetime进行编辑。@Byers datetime的默认值是datetime.MinValue,所以在示例中,您没有使用datetime.MinValue,而是指定了datetime.MaxValue,这是错误的。错误“使用未指定的局部变量”需要这样做,不复杂或错误严重的代码-消息可以在简单的几行代码中重新创建。@jdk:此编译器错误发生在两种情况下:1)您的代码错误。2) 您的代码是“正确的”,但编译器无法证明它(例如,这里它忽略了1==1始终为真),因此它给出了一个错误。在情况1)中,您应该修复代码。在情况2)中,您需要a)重构代码,以便向编译器证明您从未访问未分配变量,或者b)通过为未分配变量分配一些伪值来绕过编译器检查。我把这个问题解释为想知道情况2b的解决方案。编译器知道1==1总是正确的。原来的海报是错误的;给定的代码不会产生所述错误。编译器不知道结果总是真的一个例子是x*0==0,对于整数x。C#2.0编译器的评估结果总是正确的,但该规范规定,涉及变量的表达式不应被视为常数,以确定明确的赋值。我在C#3.0中修复了它,使其符合规范。