【问题标题】:C#. Error CS8135: Tuple with 2 elements cannot be converted to type 'object'C#。错误 CS8135:具有 2 个元素的元组无法转换为类型“对象”
【发布时间】:2018-09-05 18:07:36
【问题描述】:

考虑以下方法:

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

【问题讨论】:

  • @Chris 编译器错误在标题中:CS8135: Tuple with 2 elements cannot be convert to type object
  • 啊,抱歉。我在身体里寻找它!我看到您已经对其进行了编辑以使其现在更清晰,谢谢。我想这与类型推断有关——第一个不知道 null 是什么类型,第二个修复了这个问题,第三个知道,因为三元的两个输出必须是相同的类型。这个理论与错误信息不匹配,所以我不确定它是否正确或者是否还有更多......
  • @RufusL:相关但不重复。此处显示的条件是为了演示一种也有效的方法,但这不是问题的重点。

标签: c# valuetuple


【解决方案1】:

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

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

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

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

【讨论】:

  • lambdas 的问题比这更深。 lambda 可以是委托或表达式树。
  • 这没什么区别,重点已经说了。表达式不明确,没有明确的类型。
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2013-12-25
  • 2016-04-28
  • 2021-11-04
相关资源
最近更新 更多