2017-08-21 26 views
0

我得到這個錯誤:System.ArgumentNullException:值不能爲空。但是,這是正確的?如果.FreeAmount爲空,則應在AmountList中檢查選定金額。但它沒有這樣做。我無法真正看到我在這裏做錯了什麼。C#條件lambda代替if語句。值不能爲空錯誤

var amount = string.IsNullOrEmpty(formModel.FreeAmount) 
    ? formModel.AmountList 
     .Where(x => x.Selected) 
     .Select(a => a.Value) 
     .SingleOrDefault() 
    : formModel.FreeAmount; 
+1

你檢查如果formModel爲空? – Kostis

+1

AmountList中是否有SelectedAmount? – mcalex

+0

請將'formModel'的類包含爲'AmountList'的類。 – mjwills

回答

2

您只有在你貼如果兩個FreeAmountAmountList是空的代碼System.ArgumentNullException。如果你想在這種情況下,使用一些其他的默認值,你可以這樣做:

var amount = string.IsNullOrEmpty(formModel.FreeAmount) 
    ? formModel.AmountList == null 
     ? "Default value if FreeAmount and AmountList are null" 
     : formModel.AmountList 
      .Where(x => x.Selected) 
      .Select(a => a.Value) 
      .SingleOrDefault() 
    : formModel.FreeAmount; 

否則,如果你只是想它返回在這種情況下null(我想是更可能的,因爲這是目前與SingleOrDefault的可能性),那麼你可以只使用空條件操作符(?.):

var amount = string.IsNullOrEmpty(formModel.FreeAmount) 
    ? formModel.AmountList? // <-- The '?' will return null if AmountList is null 
     .Where(x => x.Selected) 
     .Select(a => a.Value) 
     .SingleOrDefault() 
    : formModel.FreeAmount; 
-1

在上面的語句,

左三元運算符的有側可以通過res如果formModel爲NULL,則返回NULL;

因此,string.IsNullOrEmpty(formModel.FreeAmount) =>將導致TRUE。

因此,三元運營商將評估的左側(真):標誌是,

formModel.AmountList 
     .Where(x => x.Selected) 
     .Select(a => a.Value) 
     .SingleOrDefault() 

這將導致System.ArgumentNullException因爲formModel值爲null。

因此,在formModel爲NULL的情況下,該命令將失敗並顯示System.ArgumentNullException。

+1

這是不正確的。如果'formModel'爲null,則'formModel.FreeAmount'將拋出'NullReferenceException'。它永遠不會執行'string.IsNullOrEmpty'也不會到達三元運算符。 – mjwills

+0

如果'formModel.FreeAmount'改爲'formModel?.FreeAmount',它可以進入三元組 - 但即使如此,三元組仍然會拋出一個'NullReferenceException'。 – mjwills