可能重复:
Casting: (NewType) vs. Object as NewType
Why is the C# “as” operator so popular?
嗨,
我知道这可能是个愚蠢的问题,但今天我怀疑这个问题。
做
之间有什么区别String text = (String) variable;
和
String text = variable as String;
答案 0 :(得分:6)
演员可以做三件事:
as
操作几乎总是一个引用转换,唯一的例外是取消装入可空类型:
object x = "hello";
int? y = x as int?; // y is null afterwards
然后是执行时失败的转换行为。所以差异是:
InvalidCastException
; as
将导致目标类型的空值as
无法as
只能用于取消装箱
答案 1 :(得分:4)
as
实际上不属于该类型,则 variable
将返回null(在这种情况下为String
)。演员将抛出异常。
答案 2 :(得分:2)
以下是Eric Lippert关于使用C#进行投射的博客的链接。我总结一下,但它很短,他会比我解释得好。
这是关于演员的帖子:
http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx
答案 3 :(得分:0)
有很多不同的方法可以使用C#进行转换。
这将尝试将引用转换为String引用。如果强制转换失败,则抛出异常:
string text = (String) variable;
这将尝试将引用转换为String引用。如果强制转换失败,它将返回一个空引用以分配给变量:
string text = varible as String;
这会将一个字符串引用强制转换为一个对象引用,这是一个安全的转换,因为String继承自Object:
object text = (object)"1337";
也可以隐式地转换为父类:
object text = "1337";
这将在对象内部装入一个值,然后再将其重新打包为普通值:
int value = 42;
object boxed = (object)value;
int valueAgain = (int)boxed;
拳击也可以隐式完成:
int value = 42;
object boxed = value;
int valueAgain = (int)boxed;
这将使从byte到int的扩展转换:
byte a = 42;
int b = (int)a;
与隐式转换相同:
byte a = 42;
int b = a;
这将使从int到byte的转换变窄,抛弃溢出:
int a = 512;
byte b = (byte)a; // b now contains 0