为什么这段代码被视为"可能' System.InvalidOperationException'"?

时间:2016-04-12 23:12:42

标签: c# resharper invalidoperationexception

Resharper建议我更改此代码:

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

......对此:

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

...因为," 可能' System.InvalidOperationException' "但当我接受建议的更改时,它不会编译,说,"并非所有代码路径都返回值"

" if" block有以下" else":

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

...所以我不知道为什么它没有看到"否则"确保返回一个值。

3 个答案:

答案 0 :(得分:3)

你得到的原因"并非所有代码路径都返回一个值"是因为if语句。 如果语句为false,则只有一个if语句返回路径。您需要使两个语句返回值

示例:

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; }

答案 1 :(得分:2)

好的,所以可以使用以下内容复制您的问题:

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

我不确定RptParamsFromDate的类型,但它是Nullable<DateTime>或引用类型。换句话说,关于可能的无效操作异常的警告是因为您可能正在尝试将null投射到DateTime,这是不可能的。

现在,Resharper有点困惑,因为它的默认&#39;修复&#39;只是检查null。但是你最终得到了这个:

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

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

答案 2 :(得分:1)

&#34; else&#34; 确保在您的示例中返回一个值。

方法体:

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;
}
<{1}}为真且<{1}}为空时,

将不返回任何内容。

在方法体的末尾返回默认值可以解决此问题:

getBeginDate