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

taq*_*ion 1 c# valuetuple

考虑以下方法:

public object Foo(bool flag)
{
    if (flag) 
        return (new object(), new object());
    return (null, new object()); //Compiler error over here!!
}
Run Code Online (Sandbox Code Playgroud)

这不会编译显示我在这个问题的标题中提到的错误。我可以通过如下所示的演员来解决这个问题:

public object Foo(bool flag)
{
    if (flag) 
        return (new object(), new object());
    return ((object)null, new object());
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。奇怪的部分和我问这个的原因是,如果我改变语法并使用三元运算符而不是像这样的 if-else 语句:

public object Boo(bool flag) => flag
                                ? (new object(), new object())
                                : (null, new object());
Run Code Online (Sandbox Code Playgroud)

那么就不需要演员表了!!!为什么?恕我直言,编写该方法的两种方式在语义上都是相同的。我知道生成的 IL 可能不一样(没有检查过)。

Jef*_*ado 6

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

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

Action x = () => { }; // ok
var y = () => { }; // error
Run Code Online (Sandbox Code Playgroud)

顺便说一句,而不是使用(object)null的价值,我会强烈建议使用default(object),而不是这样你不会自己绑到一个特定的值,而是适合你给类型的值。