【问题标题】:Assign non nullable value in boolean only if its non null仅当其非 null 时才在布尔值中分配不可为空的值
【发布时间】:2018-12-04 13:30:19
【问题描述】:

我有一个对象,它有一个名为 NameIndicator 的布尔字段(外部合同之一)。在我的代码中,我将布尔值“IsIndicated”设为可为空。

如何检查 null 并仅在非 null 时才赋值?

我目前在下面的代码中遇到编译时错误,因为它显然将可空字段与不可空字段关联

 personDetails.Name= new Name_Format()
                    {
                        NameSpecified = true,
                        NameIndicator = contract.IsIndicated
                    };

【问题讨论】:

  • 什么意思?如果它不可为空,那么它将始终为“非空”。
  • 如果它“简单”,那有什么问题?到目前为止,您已经将两个布尔字段描述为“不可为空”,并且您正在询问如果有值如何将一个设置为另一个。好吧,不可为空意味着总是有一个值。因此,只需像您已经分配的那样分配它。有什么问题?你在说什么错误?澄清问题。
  • 此处:“在我的代码中,我将布尔值“IsIndicated”设为不可为空。”此处:“NameIndicator 不可为空布尔值” i> 你试过阅读你自己的问题吗?
  • 如果可为空的值为空,您是否要分配一个值?在这种情况下,您可以使用 ?? 运算符 -- null 合并运算符
  • @David:虽然这是完全合法的,但更惯用的写作方式是NameIndicator = contract.IsIndicated ?? false

标签: c# asp.net .net boolean non-nullable


【解决方案1】:

如果您想在 null 的情况下分配一个特定的值,否则该值,您使用 null 合并运算符

personDetails.Name= new Name_Format()
{
  NameSpecified = true,
  NameIndicator = contract.IsIndicated ?? true
};

具有相同的语义
personDetails.Name = new Name_Format()
{
  NameSpecified = true,
  NameIndicator = contract.IsIndicated == null ? true : contract.IsIndicated.Value
};

除了当然它只调用一次IsIndicated

如果您希望运行时为您选择默认值,那么您可以这样做

personDetails.Name = new Name_Format()
{
  NameSpecified = true,
  NameIndicator = contract.IsIndicated.GetValueOrDefault()
};

在这种情况下,它将选择“false”,因为这是布尔值的默认值。

如果您不希望在值为 null 的情况下不发生任何事情,那么您可以使用 if 语句:

if (contract.IsIndicated != null)
{
  personDetails.Name = new Name_Format()
  {
    NameSpecified = true,
    NameIndicator = contract.IsIndicated.Value
  }
};

【讨论】:

  • 谢谢埃里克。关于最后一个块的一个快速问题,所以如果它为空,那么 NameIndicator 值仍会被假定为假吗?因为如果它为空,则该块根本不会执行
  • @Learner:在最后一种情况下,Name 如果值为 null,则根本不分配,正确。但是您仍然必须使用Value 来获取不可为空的值以使编译器满意。 C# 没有流类型,这是它需要确定IsIndicatedif 的主体内是非空的。
  • Nullable<T> 结构也有一个 HasValue 属性,你可以检查它,它读起来更流畅(至少对我来说)。
  • @EricLippert:再次感谢您,当然。 :) 感谢您提供有用的见解,从这里获得了很多... :)
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2017-06-28
  • 1970-01-01
  • 2015-07-29
相关资源
最近更新 更多