可能的重复项:
直接铸造与"作为"操作员?
谁能分辨出代码片段之间的实际区别?
var unknown = (object)new List<string>();
// Snippet 1: as operator
foreach (var item in unknown as IList<int>) {
// Do something with item
}
// Snippet 2: cast operator
foreach (var item in (IList<int>)unknown) {
// Do something with item
}
作为运算符不会引发错误,但强制转换将引发错误 InvalidCastException
来自 MSDN
as 运算符类似于强制转换,只是它在转换失败时生成 null 而不是引发异常。
expression as type
相当于:
expression is type ? (type)expression : (type)null
除了表达式只计算一次。
请注意,as 运算符仅执行引用转换和装箱转换。as 运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。
在 C# 中使用 as 运算符与强制转换在三个重要方面有所不同:
-
当您尝试转换的变量不属于请求的类型或在其继承链中时,它会返回 null,而不是引发异常。
-
它只能应用于转换为引用类型的引用类型变量。
- 使用 as 不会执行用户定义的转换,例如隐式或显式转换运算符,而强制转换语法将执行此操作。
参考博客