输入Cast Operator Precedence

时间:2014-02-27 21:54:13

标签: c#

我今天遇到了一个场景,同时在我的应用程序中实现了搜索功能,让我感到困惑。看看这个片段:

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关键字 - 运算符是什么,它的优先级是什么?

4 个答案:

答案 0 :(得分:12)

非常简单。

如果你没有将演员表包装在括号中..你正在投出整个表达式:

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

您实际上是将string投射到Product。鉴于:

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

仅投射该部分,允许.访问Product的属性。希望这些酒吧可以更清楚地向您展示差异。

答案 1 :(得分:4)

x.y的优先级高于演员:

7.3.1运营商优先级和关联性

  

下表按优先顺序汇总了所有运算符   从最高到最低:

     

主要x.y f(x)a [x] x ++ x--检查新类型的默认值   未经检查的代表

     

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

答案 2 :(得分:1)

这不是优先权。始终转换价值

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

在您的案例值中由itemsList.Values[i]返回,该值正在转换为Product。然后,您尝试从中访问ProductName。

CAST是运营商

Is/as仅适用于参考类型

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

READ MORE了解difference between CAST and AS

答案 3 :(得分:1)

(Product)itemsList.Values[i].ProductName;表示(Product)(itemsList.Values[i].ProductName);,而第二行是您明确说要投出Values[i]然后执行.ProductName;