为什么这两个表达式在语义上不相同?

时间:2016-04-27 09:33:37

标签: c#

为什么第一个测试会引发编译器错误而第二个测试没有?对我来说,他们似乎在语义上等同。

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

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

3 个答案:

答案 0 :(得分:9)

条件运算符要求两个操作数属于同一类型。 nullbool不兼容,并且boolnull没有自动转换。你需要明确地演员:

return input ? (bool?)input : null;

另一方面,从boolbool?以及nullbool?都有自动转换,这就是为什么你可以返回来自bool方法的nullbool?

答案 1 :(得分:4)

类型推断规则声明:

  

first_expression和second_expression的类型必须是   相同,或者必须存在从一种类型到另一种类型的隐式转换。

因此编译器能够推断bool?的类型。

此类型推断并非在if语句中发生,因此明确说明类型是您的工作。

答案 2 :(得分:1)

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