1

考虑以下方法:

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

4

1 回答 1

7

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

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

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

(object)null顺便说一句,我强烈建议不要将其用作值,而是使用这种default(object)方式,您不会将自己绑定到特定值,而是适合您给出的类型的值。

于 2018-09-05T18:19:18.987 回答