C#。错误 CS8135:具有 2 个元素的元组无法转换为类型 'object'
C#. Error CS8135: Tuple with 2 elements cannot be converted to type 'object'
考虑以下方法:
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 可能不一样(还没有检查过)。
问题是null
表达式没有明确的类型,它取决于使用它的上下文。对于条件运算符,编译器必须在 (object, object)
和 (null, object)
之间找到一个公共类型。在那种情况下,它可以推断出 null
可能是 object
.
当编译器看到 (null, object)
并需要转换为 object
时,值 null
可以是多种类型,因此会出现错误。除非您给它提示,否则它无法推断出 lambda 的类型的原因相同。
Action x = () => { }; // ok
var y = () => { }; // error
顺便说一句,与其使用 (object)null
作为值,我强烈建议使用 default(object)
而不是这样你就不会将自己绑定到特定值,而是一个合适的值对于您提供的类型。
考虑以下方法:
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 可能不一样(还没有检查过)。
问题是null
表达式没有明确的类型,它取决于使用它的上下文。对于条件运算符,编译器必须在 (object, object)
和 (null, object)
之间找到一个公共类型。在那种情况下,它可以推断出 null
可能是 object
.
当编译器看到 (null, object)
并需要转换为 object
时,值 null
可以是多种类型,因此会出现错误。除非您给它提示,否则它无法推断出 lambda 的类型的原因相同。
Action x = () => { }; // ok
var y = () => { }; // error
顺便说一句,与其使用 (object)null
作为值,我强烈建议使用 default(object)
而不是这样你就不会将自己绑定到特定值,而是一个合适的值对于您提供的类型。