【发布时间】: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