【发布时间】:2011-04-13 01:11:08
【问题描述】:
可能的重复:
Direct casting vs 'as' operator?
Casting: (NewType) vs. Object as NewType
普通类型转换和使用“AS”关键字有什么区别?
【问题讨论】:
可能的重复:
Direct casting vs 'as' operator?
Casting: (NewType) vs. Object as NewType
普通类型转换和使用“AS”关键字有什么区别?
【问题讨论】:
如果对象的类型错误,使用as 将正常失败,并且结果值将为空,正常转换会抛出 InvalidCastException:
object x = new object();
string y = x as string; // y == null
string z = (string)x; // InvalidCastException
【讨论】:
这两个运算符的用例表面上相似,但语义上却大不相同。演员向读者传达“我确信这种转换是合法的,如果我错了,我愿意接受运行时异常”。 “as” 运算符传达“我不知道这种转换是否合法;我们将试一试,看看效果如何”。
有关此主题的更多信息,请参阅我关于该主题的文章:
【讨论】:
as 关键字,因为我只是更喜欢看:(myobj as MyType).SomeProperty 而不是((MyType)myobj).SomeProperty 在这种情况下,我所做的方式表明我愿意如果没有,请在运行时使用NullReferenceException。只是想指出这是一种风格。
as 对我来说在风格上是错误的。这会让我们想知道为什么没有完成演员表。此外,与空引用异常相比,无效的强制转换异常会导致开发人员更快地解决问题。我更喜欢 Eric 的风格。
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 只能用于引用类型。这实际上是很合乎逻辑的,因为如果转换失败,它会返回 false,而这对于值类型来说是不可能的。
所以对于值类型,必须使用正常的类型转换。
【讨论】:
as 不能与值类型(不可为空的类型)一起使用。
对于引用类型...
expression as type
其实是一样的
expression is type ? (type) expression : (type) null
除了expression 只计算一次。
向比尔·克林顿致敬,“表达就是类型”中的“是”,我的意思是“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?没有。为空。
为什么里面有物体?原来我在上面用“is”解释“as”时撒了谎。
观察:
uint? u = 52;
int? i = (u is int?) ? (int?) u : (int?) null;
'i' 现在是 null
uint? u = 52;
int? i = u as int?;
哎呀。编译器错误。所以,我猜这两种说法毕竟不完全一样。
【讨论】: