2016-04-12 65 views
-2

ReSharper的建议我更改此代码:为什么这段代码被认为是“可能的”System.InvalidOperationException'“?

if (getBeginDate) 
{ 
    return (DateTime)RptParamsFromDate; 
} 

...这样的:

if (getBeginDate) 
{ 
    if (RptParamsFromDate != null) return (DateTime)RptParamsFromDate; 
} 

...因为, “可能 'System.InvalidOperationException'” 但是当我接受了建议它不编译,说:“不是所有代码路径都返回一个值”

“if”块有一个下面的“else”:

else 
{ 
    int daysToAddToToDate = DateTime.DaysInMonth(RptParamsToDate.Value.Year, RptParamsToDate.Value.Month) - 1; 
    RptParamsToDate = RptParamsToDate.Value.AddDays(daysToAddToToDate); 
    return (DateTime)RptParamsToDate; 
} 

...所以我不知道为什么它没有看到“其他”作为确保返回值。

+1

无论你'if'块需要一个'else'块,或者需要有一个返回外部给他们对于所有你的代码路径来说都返回一个值,如果'getBeginDate'为true并且'RptParamsFromDate'为null,那么你现在没有结果。 –

+1

因此,您的问题是为什么该代码可能导致InvalidOperationException,或者为什么在Resharper“修复”它后出现构建错误? –

+1

您正在收到“可能无效的操作异常”警告,因为将'null'投射到'DateTime'是不安全的。 –

回答

1

“else”不是请确保您的示例中返回了一个值。

的方法体:

if (getBeginDate) 
{ 
    if (RptParamsFromDate != null) return (DateTime) RptParamsFromDate; 
} 
else 
{ 
    int daysToAddToToDate = DateTime.DaysInMonth(RptParamsToDate.Value.Year, RptParamsToDate.Value.Month) - 1; 
    RptParamsToDate = RptParamsToDate.Value.AddDays(daysToAddToToDate); 
    return (DateTime)RptParamsToDate; 
} 

将返回没事的时候getBeginDate是真实的,RptParamsFromDate为空。

一个返回的方法体结束的默认值就可以解决这个问题:

if (getBeginDate) 
{ 
    if (RptParamsFromDate != null) return (DateTime) RptParamsFromDate; 
} 
else 
{ 
    int daysToAddToToDate = DateTime.DaysInMonth(RptParamsToDate.Value.Year, RptParamsToDate.Value.Month) - 1; 
    RptParamsToDate = RptParamsToDate.Value.AddDays(daysToAddToToDate); 
    return (DateTime)RptParamsToDate; 
} 

DateTime defaultValue = DateTime.MinValue;//or what have you 
return defaultValue; 
3

你得到“不是所有代码路径都返回一个值”的原因是因为if语句。 如果语句为false,则只有其中一个if语句返回路径。你需要让语句返回值

例子:

void Main() 
{ 
    DoSomething(); 
} 
DateTime? MaybeGetDate() 
{ 
    return null; 
} 
DateTime DoSomething() 
{ 
    DateTime? test = MaybeGetDate(); 
    return (DateTime)test; 
} 

我不知道是什么类型:

if (getBeginDate) 
{ 
    if (RptParamsFromDate != null) 
     return (DateTime)RptParamsFromDate; 
    else 
    { 
     int daysToAddToToDate = DateTime.DaysInMonth(RptParamsToDate.Value.Year, RptParamsToDate.Value.Month) - 1; 
     RptParamsToDate = RptParamsToDate.Value.AddDays(daysToAddToToDate); 
     return (DateTime)RptParamsToDate; 
    } 
} 
else { return null; } 
+0

“无法将null转换为'System.DateTime',因为它是非空值类型” –

+1

然后将它设置为类似DateTime.MinValue或DateTime.Now()或DateTime.MaxValue或DateTime.Today()它并不重要。 –

1

好了,你的问题可以用下面的复制你有RptParamsFromDate,但它可能是Nullable<DateTime>或参考类型。换句话说,关于可能的无效操作异常的警告是因为您可能试图将null转换为DateTime,这是不可能的。

现在,Resharper有点困惑,因为它的默认'修复'是简单地检查为空。但随后你结束了这一点:

DateTime DoSomething() 
{ 
    DateTime? test = MaybeGetDate(); 
    if (test != null) 
     return (DateTime)test; 
} 

这应该是清楚的,为什么它不会编译 - 该方法不返回任何如果test空。因此,在这种情况下,您需要手动返回合适的DateTime。这是Resharper不能或不会帮助的。在这种情况下,也许DateTime.MinValue是合适的候选人。