C#。错误CS8135:包含2个元素的元组无法转换为类型';对象';

C#。错误CS8135:包含2个元素的元组无法转换为类型';对象';,c#,valuetuple,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)

考虑以下方法:

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());

那么就不需要施法了!!!为什么?IMHO编写方法的两种方式在语义上是相同的。我知道生成的IL可能不一样(没有检查)

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

当编译器看到
(null,object)
并需要转换为
object
时,值
null
可以是多种类型,因此会导致错误。这也是为什么它不能推断lambdas的类型的原因,除非您给出提示

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

另一方面,与其使用
(object)null
作为值,我强烈建议使用
default(object)
,这样您就不会将自己绑定到特定的值,而是适合您给定的类型的值。

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

当编译器看到
(null,object)
并需要转换为
object
时,值
null
可以是多种类型,因此会导致错误。这也是为什么它不能推断lambdas的类型的原因,除非您给出提示

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

另一方面,与其使用
(object)null
作为值,我强烈建议使用
default(object)
,这样您就不会将自己绑定到特定的值,而是一个适合您给定类型的值。

@Chris编译器错误在标题中:CS8135:Tuple(包含2个元素)无法转换为objectAh类型,我很抱歉。我在体内寻找它!我看你已经编辑过了,现在更清楚了,谢谢。我可以想象这与类型推断有关——第一个不知道null是什么类型,第二个修复了它,第三个知道,因为三元的两个输出必须是相同的类型。这个理论与错误信息不匹配,所以我不确定它是否正确,或者是否有更多的错误…可能是@RufusL:Related的重复,但不是重复。这里显示的条件是为了演示一种同样有效的方法,但这不是问题的焦点。@Chris编译器错误在标题中:CS8135:具有2个元素的Tuple不能转换为objectAh类型,我很抱歉。我在体内寻找它!我看你已经编辑过了,现在更清楚了,谢谢。我可以想象这与类型推断有关——第一个不知道null是什么类型,第二个修复了它,第三个知道,因为三元的两个输出必须是相同的类型。这个理论与错误信息不匹配,所以我不确定它是否正确,或者是否有更多的错误…可能是@RufusL:Related的重复,但不是重复。这里显示的条件是为了演示一种同样有效的方法,但它不是问题的焦点。lambdas的问题远不止于此。lambda可以是委托树或表达式树。这没有区别,这一点已经提出了。表达式不明确,没有确定的类型。lambdas的问题不止于此。lambda可以是委托树或表达式树。这没有区别,这一点已经提出了。表达式不明确,没有确定的类型。