类型转换运算符优先级

3

今天在我的应用程序中实现搜索功能时遇到了一个情景,让我感到困惑。请看以下代码片段:

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关键字呢?它是一个运算符吗?它的优先级又是多少?


在https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx上有一个优先顺序表。 - James Moore
4个回答

14

其实很简单。

当你不用括号将类型转换包裹起来时,你就是在对整个表达式进行类型转换:

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

你基本上是将一个 string 转换为了一个 Product。然而:

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

只对那部分进行转换,允许.访问Product的属性。希望这些条能更清晰地展示它们之间的差异。


你的解释非常好,视觉实现也很棒。点个赞! - hsim
2
如果你没有将强制类型转换用括号括起来,那么你就是在对整个表达式进行转换。这对于这个特定的例子是正确的,因为“.”是一种主操作符,具有最高的优先级,而(T)x操作符是一元操作符,其次高。但这并不一定适用于所有表达式! - Chris

4

x.y的优先级高于强制类型转换:

7.3.1 运算符优先级和结合性

以下表格按照从高到低的优先级总结了所有运算符:

Primary x.y f(x) a[x] x++ x-- new typeof default checked unchecked delegate

Unary + - ! ~ ++x --x (T)x


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;

阅读更多 了解 CASTAS 之间的区别。


1

(Product)itemsList.Values[i].ProductName; 的意思是将 itemsList.Values[i].ProductName 强制转换为 Product 类型;而第二行代码则明确地指示要对 Values[i] 进行强制转换,然后再执行 .ProductName 操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接