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可以是委托树或表达式树。这没有区别,这一点已经提出了。表达式不明确,没有确定的类型。