编译器不允许我使用三元运算符

时间:2016-07-04 16:28:01

标签: c# object compiler-errors ternary-operator

我试图返回数组" arr "根据输入对象类型的类型,可以是string[]string

public static object custom_return(object ob, string[] arr)
{
    return ob.GetType() == typeof(string) ? arr[0] : arr;
}

此代码无法编译,因为

  

ErrorCS0173无法确定条件表达式的类型   因为' string'之间没有隐式转换。和   '串[]'

但如果分手了

    public static object custom_return(object ob, string[] arr)
    {
        if (ob.GetType() == typeof(string))
            return arr[0];
        else
            return arr;
    }

根本没问题。为什么会这样?

2 个答案:

答案 0 :(得分:4)

它不起作用,因为在三元运算符中,第二类必须匹配(隐式或显式)第一类(反之亦然)。

如果您执行此操作:

return ob.GetType() == typeof(string) ? (object)arr[0] : arr;

因为string[]可以隐式转换为object

相反(施放string[]object )也可以使用

三元运算符中两个成员之间的类型匹配在分配给结果之前进行评估,因此在您的情况下,它会在它甚至知道它将被分配给错误之前给出错误。 object {所以它不能推断两种类型都应该能够隐式转换为object

请注意(这是主观的和可观察的),在类型不匹配时更喜欢if/else(我倾向于将三元表达视为&#34 ;单值")。对我而言,它使代码更具可读性并且不易出错。

答案 1 :(得分:2)

来自MSDN

  

first_expression和second_expression的类型必须是   相同,或者必须存在从一种类型到另一种类型的隐式转换。

在您的情况下,stringstring[]之间不存在隐式转换。