为什么第一个测试会引发编译器错误而第二个测试没有?对我来说,他们似乎在语义上等同。
public bool? inlineTest(bool input)
{
return input ? null : input;
}
public bool? expandedTest(bool input)
{
if (input)
return input;
else
return null;
}
答案 0 :(得分:9)
条件运算符要求两个操作数属于同一类型。 null
和bool
不兼容,并且bool
到null
没有自动转换。你需要明确地演员:
return input ? (bool?)input : null;
另一方面,从bool
到bool?
以及null
到bool?
都有自动转换,这就是为什么你可以返回来自bool
方法的null
和bool?
。
答案 1 :(得分:4)
类型推断规则声明:
first_expression和second_expression的类型必须是 相同,或者必须存在从一种类型到另一种类型的隐式转换。
因此编译器能够推断bool?
的类型。
此类型推断并非在if
语句中发生,因此明确说明类型是您的工作。
答案 2 :(得分:1)
使用条件运算符时,两个操作数应具有相同的数据类型。