Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 布尔值为null的条件表达式产生编译器错误_C# - Fatal编程技术网

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”
这就像我期望的那样,但是现在我想做一些类似的事情,除了一个bool?而不是字符串。请参见以下属性

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?);我只是复制了属性的字符串版本并更改了值,我更关心的是错误,而不是简化表达式。我只是复制了属性的字符串版本并更改了值,我更关心的是错误,而不是简化表达式。