C#。错误CS8135:具有2个元素的元组无法转换为类型“对象”

时间:2018-09-05 18:07:36

标签: c# valuetuple

请考虑以下方法:

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可能不一样(没有检查过)。

1 个答案:

答案 0 :(得分:4)

问题在于null表达式没有确定的类型,它取决于使用它的上下文。对于条件运算符,编译器必须在(object, object)(null, object)之间找到一个公共类型。在这种情况下,可以推断出null可能是object

当编译器看到(null, object)并需要转换为object时,值null可能是多种类型,因此会出错。除非您给出提示,否则无法推断出lambda类型的原因相同。

Action x = () => { }; // ok
var y = () => { }; // error

顺便说一句,我强烈建议不要使用(object)null作为值,而不是将default(object)用作特定的值,而应将其绑定到特定的值您输入的类型。