as功能:
运算符类似于强制转换操作;但是,如果转换不可行,as会返回 null而不是引发异常。更严格地说,这种形式的表达式
相当于:expression is type ? (type)expression : (type)null 做类型检测判断,如果类型兼容则转换,否则返回null
只是as 只被计算一次。
使用规则:
1、as只能用于引用类型不能用于值类型,值类型不能继承所以无法做检测。
2、没有继承关系的引用类型之间无法转化,编辑器会直接报错。
例如:要求x所属的类与类A必须是子类和父类的关系,否则编译错误。如果x属于类A的子类B,x as A值也为true。
原理分析:
从corelr角度分析as用法
源代码:https://github.com/Potapy4/dotnet-coreclr/blob/master/src/vm/jitinterface.h
is/as 关键字是通过CLR中的 isinst 指令实现,而非反射。
isinst 在当下CoreCLR实现中,对于引用以及值类型,JIT会生成代码调用CoreCLR内部的FCall方法 JIT_IsInstanceOfClass_Portable\JIT_IsInstanceOfClass ,而对于接口类型的断定会调用JIT_IsInstanceOfInterface_Portable\JIT_IsInstanceOfInterface 。
InstanceOfClass 在java就是用于多态检测。所以我们可以指定as 就是java中的InstanceOfClass功能。
个人总结:原理是as用来检测多态的,多态是对行为抽象。而值类型没有行为 当然无法转化, 所以不能将as is用于值类型