可能的重复:
直接转换 vs 'as' 操作符?
类型转换:(NewType) vs. Object as NewType
普通类型转换和使用“AS”关键字有什么区别?
使用as
关键字可以在对象类型错误时优雅地失败,结果值会变为null。普通的强制类型转换会抛出InvalidCastException异常:
object x = new object();
string y = x as string; // y == null
string z = (string)x; // InvalidCastException
as
转换永远不会抛出异常,而通常的转换可能会。
Object a = new Object();
String b = a as String;
if(b != null) // always false for this example.
{}
普通类型转换可能会返回IllegalTypeCast异常,而as
在这种情况下将返回null
。
((Class2) obj) // Throws exception when the casting cannot be made
Class2 C = obj as Class2 // Will return NULL if the casting cannot be made
as
不能用于值类型(非可空类型)。
对于引用类型...
expression as type
真的和
expression is type ? (type) expression : (type) null
除了expression
只被评估一次之外。
为了向比尔·克林顿致敬,在“expression is type”中的“is”我指的是“is”。
基本上,正如其他答案所示,这意味着当强制转换失败时,as返回null。但是,当强制转换成功但类型错误时,它也会返回null。
这里有一个有点傻的例子:
uint? u = 52;
int? i = (int?) u; // 'i' is now 52
但是
uint? u = 52;
object d = u;
int? i = d as int?;
i的值是多少?52?不对,它是null。
为什么有个对象在那里?事实证明,当我用“is”解释“as”时,我撒了谎。
观察:
uint? u = 52;
int? i = (u is int?) ? (int?) u : (int?) null;
'i'现在是null
uint? u = 52;
int? i = u as int?;
糟糕。编译器错误。看来这两个语句并不完全相同。
此外,as 只能用于引用类型。这实际上是相当合理的,因为如果转换失败,它会返回 false,而这不是值类型的可能值。
因此,对于值类型,必须使用普通类型转换。
as
关键字,因为我更喜欢看到:(myobj as MyType).SomeProperty
而不是((MyType)myobj).SomeProperty
。在这种情况下,我所做的方式表明,如果运行时出现问题,我愿意接受NullReferenceException
。只是想指出这是一种风格上的事情。 - jasonhas
的方式在风格上看起来不太对。这会让我想知道为什么没有进行强制转换。此外,无效的强制转换异常会比空引用异常更快地引导开发人员找到问题。我更喜欢 Eric 的风格。 - Jeffrey L Whitledge