C#。错误 CS8135:具有 2 个元素的元组无法转换为类型 'object'

C#. Error CS8135: Tuple with 2 elements cannot be converted to type 'object'

考虑以下方法:

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

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

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

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

顺便说一句,与其使用 (object)null 作为值,我强烈建议使用 default(object) 而不是这样你就不会将自己绑定到特定值,而是一个合适的值对于您提供的类型。