C# 布尔值为null的条件表达式产生编译器错误
请参见以下属性:C# 布尔值为null的条件表达式产生编译器错误,c#,C#,请参见以下属性: public bool LeftChecked {get;set;} public bool RightChecked {get;set;} public string LeftRight { get { return !LeftChecked && !RightChecked ? null : LeftChecked ? "L" : "R"; } } 我使用此属性的目标是执行以下操作: 如果L
public bool LeftChecked {get;set;}
public bool RightChecked {get;set;}
public string LeftRight
{
get
{
return !LeftChecked && !RightChecked ? null :
LeftChecked ? "L" : "R";
}
}
我使用此属性的目标是执行以下操作:
- 如果LeftChecked和RightChecked都等于false,则返回null
- 如果LeftChecked等于true,则返回“L”
- 否则返回“R”
public bool PassChecked {get;set;}
public bool FailChecked {get;set;}
public bool? PassFail
{
get
{
return !PassChecked && !FailChecked ? null :
PassChecked ? true : false;
}
}
但是,这给了我以下错误:
无法确定条件表达式的类型,因为“”和“bool”之间没有隐式转换。
所以我用if-else重写了它
public bool? PassFail
{
get
{
if (!PassChecked && !FailChecked) return null;
else return PassChecked ? true : false;
}
}
我在使用if-else方法方面没有问题,但是我真的很好奇为什么我的原始属性不起作用,尽管它几乎与起作用的string属性相同
我读过一些这样的问题,但是我没有遇到类似的情况。这应该可以:
return !PassChecked && !FailChecked ? null :
PassChecked ? (bool?)true : (bool?)false;
这应该起作用:
return !PassChecked && !FailChecked ? null :
PassChecked ? (bool?)true : (bool?)false;
我不明白如何使用表达式
PassChecked?真:假
。PassChecked
属性的类型已经是bool
。通过三元运算符发送它只是为了返回与原始值相同的新bool
值有什么意义
这(实际上与slugster在评论中的建议相同)也应该起作用:
return PassChecked ? true : FailChecked ? false : (bool?)null;
或者,如果您更喜欢原始表达式的基本结构:
return (!PassChecked && !FailChecked) ? (bool?)null : PassChecked;
我更喜欢
(bool?)null
而不是default(bool?
),但这完全是一个品味问题。它们是等价的,并且同样有效。我不明白如何使用表达式PassChecked?真:假
。PassChecked
属性的类型已经是bool
。通过三元运算符发送它只是为了返回与原始值相同的新bool
值有什么意义
这(实际上与slugster在评论中的建议相同)也应该起作用:
return PassChecked ? true : FailChecked ? false : (bool?)null;
或者,如果您更喜欢原始表达式的基本结构:
return (!PassChecked && !FailChecked) ? (bool?)null : PassChecked;
我更喜欢
(bool?)null
而不是default(bool?
),但这完全是一个品味问题。它们是等效的,并且同样工作良好。原始问题中的代码现在使用该功能在C#9中“正常工作”
历史上,条件运算符的类型是通过查看后两个操作数的类型来确定的,如果存在从一个操作数到另一个操作数的转换,则我们使用“其他”操作数作为运算符的类型。() 在本例中,一个操作数为
null
,另一个操作数的类型为bool
。在这种情况下,只有bool
操作数具有类型,并且null
无法转换为bool
,因此C#9之前的语言无法确定条件表达式的类型
现在我们有了目标类型的条件表达式,编译器可以观察到这个表达式是在需要
bool?
类型的值的位置使用的。基于此,它只是尝试将每个操作数转换为bool?
。表达式null
转换为bool?
很好,类型bool
,因此它在这种情况下做了正确的事情,并为条件运算符提供了类型bool?
,原始问题中的代码现在使用该功能在C#9中“只起作用”
历史上,条件运算符的类型是通过查看后两个操作数的类型来确定的,如果存在从一个操作数到另一个操作数的转换,则我们使用“其他”操作数作为运算符的类型。() 在本例中,一个操作数为
null
,另一个操作数的类型为bool
。在这种情况下,只有bool
操作数具有类型,并且null
无法转换为bool
,因此C#9之前的语言无法确定条件表达式的类型
现在我们有了目标类型的条件表达式,编译器可以观察到这个表达式是在需要
bool?
类型的值的位置使用的。基于此,它只是尝试将每个操作数转换为bool?
。表达式null
转换为bool?
很好,就像类型bool
一样,因此它在这种情况下做了正确的事情,并给条件运算符类型bool?
哇,我很惊讶编译器没有隐式地将true和false转换为bool?在这种情况下,而在其他情况下,它会。它也没有在这些值下面划线,实际上它在null:
下面划线。。。不管怎么说,这确实有效,谢谢@rshepp查看这篇文章的解释-哇,我很惊讶编译器没有隐式地将true和false转换为bool?在这种情况下,而在其他情况下,它会。它也没有在这些值下面划线,实际上它在null:
下面划线。。。不管怎么说,这确实有效,谢谢@rshepp检查此帖子以了解解释-返回密码检查?正确:故障检查?false:默认值(bool?);回程票?正确:故障检查?false:默认值(bool?);我只是复制了属性的字符串版本并更改了值,我更关心的是错误,而不是简化表达式。我只是复制了属性的字符串版本并更改了值,我更关心的是错误,而不是简化表达式。