考虑以下方法:
public object Foo(bool flag)
{
if (flag)
return (new object(), new object());
return (null, new object()); //Compiler error over here!!
}
Run Code Online (Sandbox Code Playgroud)
这不会编译显示我在这个问题的标题中提到的错误。我可以通过如下所示的演员来解决这个问题:
public object Foo(bool flag)
{
if (flag)
return (new object(), new object());
return ((object)null, new object());
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。奇怪的部分和我问这个的原因是,如果我改变语法并使用三元运算符而不是像这样的 if-else 语句:
public object Boo(bool flag) => flag
? (new object(), new object())
: (null, new object());
Run Code Online (Sandbox Code Playgroud)
那么就不需要演员表了!!!为什么?恕我直言,编写该方法的两种方式在语义上都是相同的。我知道生成的 IL 可能不一样(没有检查过)。
问题是null表达式没有确定的类型,它取决于使用它的上下文。在条件运算符的情况下,编译器必须在(object, object)和之间找到一个公共类型(null, object)。在那种情况下,它可以推断出null可能是object。
当编译器看到(null, object)并需要转换为 时object,该值null可以是多种类型,因此会出现错误。这与它无法推断 lambda 类型的原因相同,除非您给它提示。
Action x = () => { }; // ok
var y = () => { }; // error
Run Code Online (Sandbox Code Playgroud)
顺便说一句,而不是使用(object)null的价值,我会强烈建议使用default(object),而不是这样你不会自己绑到一个特定的值,而是适合你给类型的值。