铸造和作为的区别是什么?

56
在C#中,强制转换对象和使用as关键字之间有什么区别吗?希望这段代码能说明我的意思...
String text = "Hello hello";
Object obj = text; 

String originalCast = ((String)obj).ToUpper();
String originalAs = (obj as String).ToUpper();

这是一个关于C语言中类型转换的问题,与其他类似的问题如出一辙。 - annakata
duplicate of https://dev59.com/QXVD5IYBdhLWcg3wXacd - pirho
4个回答

106

1
他的示例不会引发 NullReferenceException。 - Blindy
2
@Blindy - 是的,这样做可能会有问题。他试图对一个可能为空的对象执行 ToUpper() 操作。 - rein
谢谢,我以为那只是速记! - user110714
3
@rein - 我认为Blindy的意思是,他所提供的例子不会导致运行时错误。第2行将obj赋值为一个字符串对象。 - Roy Tinker

23

除了已经提到的 InvalidCastException 之外...

as 在目标类型为值类型时无法使用(除非它是可空类型):

obj as int // compile time error.

10
据我所知!
使用 'as' 如果转换失败,将返回 null,而强制类型转换(casting)如果失败将抛出异常。

5
使用'as'不会在obj不是字符串时抛出异常,而是返回null。在您的情况下,这仍然会抛出异常,因为您立即引用了此空值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接