2014-02-27 41 views
2

我今天遇到了一個場景,同時在我的應用程序中實現了搜索功能,這讓我感到困惑。看看這個片斷:類型演算算子優先級

public string GetFirstProductName(SortedList<string, object> itemsList) { 
    for (int i = 0; i < itemsList.Values.Count; i++) { 
     if (itemsList.Values[i] is Product) 
      // Doesn't Compile: 
      // return (Product)itemsList.Values[i].ProductName; 

      // Does compile. Precedence for the "." higher than the cast? 
      return ((Product)itemsList.Values[i]).ProductName; 
     } 
    } 
} 

那麼,什麼是演員的優先級?演員是演員嗎?關鍵字as怎麼樣 - 是一個運算符,它的優先級是什麼?

+0

在https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx有優先順序表 –

回答

9

它真的很簡單。

當你不裹在括號中投..你鑄造整個表達式:

return (Product)itemsList.Values[i].ProductName; 
//    |______________________________| 

你基本上鑄造stringProduct。鑑於:

return ((Product)itemsList.Values[i]).ProductName; 
//  |____________________________| 

施放只是一部分,允許.訪問Product的屬性。希望酒吧能夠幫助您更清楚地展示您的差異。

+0

這是一個很棒的解釋。 +1用於視覺實現。 – hsim

+0

「當你不把括號內的劇情換行......你正在投射整個表情」對於這個特定的例子來說是真實的*,因爲「。」是主操作符並且具有最高優先級,而(T)x操作符是一元操作符並且是次高。對所有表情來說都不一定是對的! – Chris

1

這不是優先順序。總價值在正在itemsList.Values[i]返回你的情況下值被鑄造成產品轉換

// Does compile. Precedence for the "." higher than the cast? 
return ((Product)itemsList.Values[i]).ProductName; 

。然後你試圖從它訪問ProductName。

CAST只在引用類型的操作

Is/as作品

return (itemsList.Values[i] as Product).ProductName; 

READ MORE瞭解difference between CAST and AS

1

(Product)itemsList.Values[i].ProductName;意味着(Product)(itemsList.Values[i].ProductName);而第二行你明確說要投Values[i],然後做.ProductName;

4

x.y具有比鑄鐵更高的優先級:

7.3.1運算符優先級和結合

下表從最高總結了所有運營商優先 的順序依次爲:

初級xy f(x)a [x] x ++ x--新類型的默認選中 未選中的代表

一元+ - ! 〜++ x --x(T)x