【问题标题】:Why is this code considered a "possible 'System.InvalidOperationException'"?为什么这段代码被认为是“可能的'System.InvalidOperationException'”?
【发布时间】:2016-04-12 23:12:42
【问题描述】:

Resharper 建议我更改此代码:

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

...到这个:

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

...因为,“Possible 'System.InvalidOperationException'”但是当我接受建议的更改时,它没有编译,说,“并非所有代码路径都返回一个值” p>

“if”块有以下“else”:

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

...所以我不知道为什么它没有看到“else”来确保返回一个值。

【问题讨论】:

  • 您的两个 if 块都需要一个 else 块,或者需要在它们外部有一个返回,以便您的所有代码路径都返回一个值,现在如果 @ 则没有结果987654326@ 为真,RptParamsFromDate 为空。
  • 那么,您的问题是为什么该代码会导致 InvalidOperationException,或者为什么在 Resharper “修复”它之后会出现构建错误?
  • 您收到“可能的无效操作异常”警告,因为将 null 转换为 DateTime 是不安全的。
  • "并非所有代码路径都返回值" Resharper 错误与 if (RptParamsFromDate != null) return (DateTime)RptParamsFromDate; 相关联。基本上它强调当RptParamsFromDatenull 时你没有设置返回值。
  • 还有一个 else 块。必须有两个。正如我所说,如果getBeginDate 为真且RptParamsFromDate 为空,则您没有返回路径。如果您包含一个完整的 sn-p 来演示您的问题,这将有助于说明这一点,作为一个代码块。

标签: c# resharper invalidoperationexception


【解决方案1】:

您得到“并非所有代码路径都返回值”的原因是 if 语句。 如果语句为假,则只有一个 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; }

【讨论】:

  • "无法将 null 转换为 'System.DateTime',因为它是不可为空的值类型"
  • 然后将其设置为 DateTime.MinValue 或 DateTime.Now() 或 DateTime.MaxValue 或 DateTime.Today() 之类的,这并不重要。
【解决方案2】:

好的,您的问题可以通过以下方式复制:

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

我不确定RptParamsFromDate 的类型,但它要么是Nullable<DateTime>,要么是引用类型。换句话说,关于可能的无效操作异常的警告是因为您可能试图将null 转换为DateTime,这是不可能的。

现在,Resharper 有点困惑,因为它的默认“修复”是简单地检查 null。但是你最终会得到这个:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多