可能重复:
Direct casting vs 'as' operator?
Casting: (NewType) vs. Object as NewType
正常的类型转换与使用“AS”关键字有什么区别?
答案 0 :(得分:18)
如果对象的类型错误,则使用as
将会正常失败,并且结果值将为null,其中正常转换会抛出InvalidCastException:
object x = new object();
string y = x as string; // y == null
string z = (string)x; // InvalidCastException
答案 1 :(得分:8)
这两个运算符的用例在表面上是相似的,但在语义上却完全不同。演员与读者沟通“我确信这种转换是合法的,如果我错了,我愿意接受运行时异常”。 “as”操作员传达“我不知道这种转换是否合法;我们将试一试,看看它是怎么回事”。
有关此主题的更多信息,请参阅我关于此主题的文章:
答案 2 :(得分:1)
as
施法会抛出一个异常,而平常的施法可以。
Object a = new Object();
String b = a as String;
if(b != null) // always false for this example.
{}
答案 3 :(得分:1)
普通类型强制转换可能会返回IllegalTypeCast异常,而as
在这种情况下会返回null
。
答案 4 :(得分:1)
((Class2) obj) // Throws exception when the casting cannot be made
Class2 C = obj as Class2 // Will return NULL if the casting cannot be made
答案 5 :(得分:0)
as
不能与值类型(非可空类型)一起使用。
参考类型......
expression as type
与
完全相同expression is type ? (type) expression : (type) null
除了expression
仅评估一次。
向比尔克林顿致意,'表达式'中的'是',我的意思是'is'。
基本上,正如其他答案所示,这意味着当演员表失败时返回null。但是,当转换成功但类型错误时,它也会返回null。
这是一个有点愚蠢的例子:
uint? u = 52;
int? i = (int?) u; // 'i' is now 52
但
uint? u = 52;
object d = u;
int? i = d as int?;
我的价值是多少? 52?不。它是空的。
为什么那里的物体?当我用'是'解释'as'时,我说谎了。
观察:
uint? u = 52;
int? i = (u is int?) ? (int?) u : (int?) null;
'我'现在是null
uint? u = 52;
int? i = u as int?;
糟糕。编译错误。所以,我猜这两个陈述毕竟不完全相同。
答案 6 :(得分:0)
如果您使用“as”关键字,则永远不会获得转换异常。如果您尝试进行无效转换,转化结果将为null
。
隐式/显式转换可以在具有继承/实现关系的类/接口之间使用,否则会产生编译错误。见例:
public class A {}
public class B {}
...
A a = new A();
//B b = (B)a; //compile error:Cannot implicitly convert type 'A' to 'B'
答案 7 :(得分:0)
另外,因为只能与引用类型一起使用。这实际上非常合乎逻辑,因为如果转换失败,则返回false,这不是值类型的可能值。
因此,对于值类型,必须使用正常的类型转换。