C# 为什么不';这两个表达式在语义上不是等价的吗?

C# 为什么不';这两个表达式在语义上不是等价的吗?,c#,C#,为什么第一个测试会引发编译器错误,而第二个测试不会?在我看来,它们在语义上是等价的 public bool? inlineTest(bool input) { return input ? null : input; } public bool? expandedTest(bool input) { if (input) return input; else return null; } 条件运算符要求两个操作数的类型相同null和bo

为什么第一个测试会引发编译器错误,而第二个测试不会?在我看来,它们在语义上是等价的

public bool? inlineTest(bool input)
{
    return input ? null : input;
}

public bool? expandedTest(bool input)
{
    if (input)
        return input;
    else
        return null;
}

条件运算符要求两个操作数的类型相同
null
bool
不兼容,并且没有从
bool
null
的自动转换。您需要明确地强制转换:

return input ? (bool?)input : null;

另一方面,存在从
bool
bool?
的自动转换,以及从
null
bool?
的自动转换,这就是为什么可以从
bool?
方法返回
bool
null

类型推断规则声明:

第一个_表达式和第二个_表达式的类型必须是 相同,或者必须存在从一种类型到另一种类型的隐式转换

因此,如果
bool?
,编译器可以推断出类型


这种类型推断不会发生在
if
语句中,因此您的工作是显式地声明类型。

使用条件运算符时,两个操作数应具有相同的数据类型

expandedTest的等价物不是
返回输入吗?(bool?)输入:空?@Fermin:你说得对,条件中的逻辑是颠倒的。我复制粘贴了操作中的代码。现在修复。