linq .Value Nullable Object必须有一个值。 怎么跳?

我有一些linq代码有时为null

  cbo3.ItemsSource = empty.Union(from a in (from b in CompleteData select b.TourOpID).Distinct() select new ComboBoxItemString() { ValueString = a.Value.ToString() }); 

TourOpID有时会在a.Value.ToString()上抛出错误。 我该如何解决这个问题?

出现此问题的原因是您访问Nullable类型的Value属性 ,该属性为null (或者更准确地说,其HasValue属性为false )。 如何解决这个问题取决于你想要做什么:

  1. 如果要过滤掉TourOpID为null的项目,只需添加where子句:

     ... (from b in CompleteData where b.TourOpID != null // filter select b.TourOpID).Distinct() ... 
  2. 如果要使用替换值,例如0 ,如果TourOpID为null,请使用null合并运算符 ?? ,转换你的int? 进入一个int

     ... (from b in CompleteData select b.TourOpID ?? 0).Distinct() ... 

    或者,

     ... select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() }); 
  3. 如果您只想在TourOpID为null时显示不同的ComboBox条目,请使用三元运算符?: ::

     ... select new ComboBoxItemString() { ValueString = (a == null ? "no tour operator" : a.Value.ToString()) }); 

    如果要显示空字符串,如果a为null,则解决方案甚至更简单:

     ... select new ComboBoxItemString() { ValueString = a.ToString() }); 

    因为Nullable.ToString返回一个空字符串,如果它没有值。

where

 from b in CompleteData where b.TourOpID != null select b.TourOpID 

为什么不使用ValueString = a.ToString()而不是ValueString = a.Value.ToString() 。 如果a有一个值,它会将此值返回给字符串,否则 – a.ToString()将返回空字符串。

 IEnumerable arr = new List { 1m, 4m, null, 10m, 6m }; foreach (var @decimal in arr) { Console.WriteLine(@decimal.ToString()); } 

输出是:

 1 4 10 6