C# 仅当布尔值为非null时,才在布尔值中指定非null值
我有一个对象,它有一个名为NameIndicator External contract one的布尔字段。在我的代码中,我将布尔值指定为可空 如何检查null并仅在非null时赋值 我目前得到编译时错误,下面的代码很明显,它将可为null的字段分配给不可为null的字段C# 仅当布尔值为非null时,才在布尔值中指定非null值,c#,asp.net,.net,boolean,non-nullable,C#,Asp.net,.net,Boolean,Non Nullable,我有一个对象,它有一个名为NameIndicator External contract one的布尔字段。在我的代码中,我将布尔值指定为可空 如何检查null并仅在非null时赋值 我目前得到编译时错误,下面的代码很明显,它将可为null的字段分配给不可为null的字段 personDetails.Name= new Name_Format() { NameSpecified = true,
personDetails.Name= new Name_Format()
{
NameSpecified = true,
NameIndicator = contract.IsIndicated
};
如果要在null的情况下指定特定的值,而在其他情况下指定该值,则使用null合并运算符 它的语义与
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
}
};
什么意思?如果它是非空的,那么它将始终是非空的。如果它很容易,那么问题是什么?到目前为止,您已经将两个布尔字段描述为不可为空,并且您正在询问如果存在值,如何将一个设置为另一个。不可为空意味着总有一个值。因此,只需像您现在一样分配它。有什么问题吗?你说的是什么错误?澄清问题。这里:在我的代码中,我将my boolean指定为不可为空。这里:NameIndicator不可为null布尔值您是否尝试阅读您自己的问题?如果可为null的值为null,您是否希望指定一个值?在这种情况下,您使用??运算符-空合并运算符。@David:虽然这是完全合法的,但更惯用的编写方式是NameIndicator=contract.IsIndicated??谢谢你,埃里克。关于最后一个块的一个简单问题是,如果它为null,那么NameIndicator值仍将被假定为false?因为如果它是null@Learner:在最后一种情况下,如果值为null,则根本不分配名称,正确。但是您仍然必须使用Value来获取不可为null的值,以使编译器满意。C没有流类型,这是确定IsIndicated在if主体中是否为非null所需的。可为null的结构还有一个HasValue属性,您可以检查它,至少对我来说,它读起来更流畅。@EricLippert:再次感谢您,当然。:感谢您提供的有用见解,从这里获得了很多…:
if (contract.IsIndicated != null)
{
personDetails.Name = new Name_Format()
{
NameSpecified = true,
NameIndicator = contract.IsIndicated.Value
}
};