请考虑以下方法:
public object Foo(bool flag)
{
if (flag)
return (new object(), new object());
return (null, new object()); //Compiler error over here!!
}
这不会编译显示我在此问题的标题中提到的错误。我可以通过以下类型的演员来解决此问题:
public object Foo(bool flag)
{
if (flag)
return (new object(), new object());
return ((object)null, new object());
}
到目前为止,一切都很好。我要问的奇怪的部分和原因是,如果我更改语法并使用三元运算符而不是像这样的if-else语句:
public object Boo(bool flag) => flag
? (new object(), new object())
: (null, new object());
然后不需要演员!!!为什么?恕我直言,两种编写方法的方法在语义上都是相同的。我知道生成的IL可能不一样(没有检查过)。
答案 0 :(得分:4)
问题在于null
表达式没有确定的类型,它取决于使用它的上下文。对于条件运算符,编译器必须在(object, object)
和(null, object)
之间找到一个公共类型。在这种情况下,可以推断出null
可能是object
。
当编译器看到(null, object)
并需要转换为object
时,值null
可能是多种类型,因此会出错。除非您给出提示,否则无法推断出lambda类型的原因相同。
Action x = () => { }; // ok
var y = () => { }; // error
顺便说一句,我强烈建议不要使用(object)null
作为值,而不是将default(object)
用作特定的值,而应将其绑定到特定的值您输入的类型。