2016-04-12 81 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是合適的候選人。