2016-07-04 21 views
-1

返回對象我試圖根據其可以是輸入對象的類型的類型的數組返回「ARR」無論是string[]string編譯器不會讓我使用三元操作

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

該代碼不能編譯,因爲

ErrorCS0173條件表達式類型不能被確定 因爲有「字符串」並 的之間的隱式轉換特林[]」

但如果打散

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

這是一點問題都沒有。爲什麼?

回答

4

它不起作用,因爲在三元運算符中,第二個類型必須與第一個類型(隱式或顯式地)匹配(反之亦然)。

它的工作原理,如果你:

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

因爲那時string[]可以隱式轉換爲object

相反(鑄造string[]object)也將工作

的類型匹配在三元運算符中的兩個成員之間進行評估,然後將其分配給結果,所以在你的情況中,它是這樣的給出了錯誤甚至知道它會被分配到一個object(所以它不會推斷,這兩種類型應該能夠隱式轉換爲object

注意(這是主觀的,oppinionated),前I在類型不匹配時傾向於有一個if/else(我傾向於將三元表達式視爲「單值」)。對我而言,它使代碼更具可讀性並且不易出錯。

+0

輝煌,謝謝。 這使得更有意義 –

2

MSDN

要麼first_expression和second_expression的類型必須是 相同,或隱式轉換必須存在從一種類型到另一個。

而在您的情況下,stringstring[]之間不存在隱式轉換。

+0

有沒有合理的解釋爲什麼?因爲它實際上並沒有轉換類型。它不能考慮類型安全性,因爲它們變成了**對象**。所以一個轉換形式的字符串或字符串[]到對象總是存在 –