as 运算符用于将一个值显式地转换(使用引用转换或装箱转换)为一个给定的引用类型。与强制转换表达式(第 7.6.6 节)不同,as 运算符从不引发异常。它采用的是:如果指定的转换不可能实施,则运算结果为 null。
在 e as T 形式的运算中,e 必须是一个表达式,T 必须是一个引用类型。该运算的结果属于类型 T,且总是可归类为值类别。运算按下面这样计算:
如果 e 的编译时类型与 T 相同,则结果就是 e 的值。
否则,如果存在从 e 的编译时类型到 T 的隐式引用转换(第 6.1.4 节)或装箱转换(第 6.1.5 节),则执行该转换,且该转换的结果就是运算结果。
否则,如果存在从 e 的编译时类型到 T 的显式引用转换(第 6.2.3 节),则执行动态类型检查:
如果 e 的值为 null,则结果为具有编译时类型 T 的值 null。
否则,假设 R 为 e 引用的实例的运行时类型。如果 R 和 T 的类型相同,或者如果 R 为引用类型且存在从 R 到 T 的隐式引用转换,或者如果 R 为值类型且 T 是由 R 实现的一个接口类型,则结果为由 e 给定的具有编译时类型 T 的引用。
否则,结果为具有编译时类型 T 的值 null。
否则,指定的转换根本不可能实现,且发生编译时错误。
注意,as 运算符只执行引用转换和装箱转换。不可能使用 as 运算符执行其他转换(如用户定义的转换),应改为使用强制转换表达式来执行这些转换。