关于c#:正常的类型转换和使用“AS”关键字有什么区别

What is difference between normal typecasting and using “AS” keyword

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Direct casting vs 'as' operator?
Casting: (NewType) vs. Object as NewType

正常排版和使用"as"关键字有什么区别?


如果对象类型错误,则使用as将正常失败,结果值将为空,其中普通强制转换将抛出一个invalidcastexception:

1
2
3
object x = new object();
string y = x as string; // y == null
string z = (string)x; // InvalidCastException

这两个操作符的用例表面上相似,但语义上完全不同。CAST向读者传达"我确信这种转换是合法的,如果我错了,我愿意接受运行时异常"。"as"接线员传达"我不知道这种转换是否合法;我们将尝试一下,看看会怎么样"。

有关此主题的更多信息,请参阅我关于此主题的文章:

http://blogs.msdn.com/b/ericlippet/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx


1
2
3
((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将返回null


as强制转换将不允许抛出异常,而通常强制转换可以。

1
2
3
4
Object a = new Object();
String b = a as String;
if(b != null) // always false for this example.
{}

此外,as只能用于引用类型。这实际上是非常合乎逻辑的,因为如果转换失败,它将返回false,这对于值类型来说不是一个可能的值。

因此,对于值类型,必须使用普通类型转换。


如果使用"as"关键字,则永远不会得到转换异常。如果您尝试无效的转换,转换的结果将是null

隐式/显式转换可以在具有继承/实现关系的类/接口之间使用,否则将导致编译错误。见例子:

1
2
3
4
5
public class A {}
public class B {}
...
A a = new A();
//B b = (B)a;  //compile error:Cannot implicitly convert type 'A' to 'B'

隐式/显式转换的另一种情况是类A和B之间没有关系,但您自己编写隐式/显式运算符。


as不能与值类型(不可为空的类型)一起使用。

对于引用类型…

1
expression as type

真的和

1
expression is type ? (type) expression : (type) null

expression只评估一次。

为了向比尔·克林顿致敬,"is"在"expression is type"中的意思是"is"。

基本上,如其他答案所示,这意味着当强制转换失败时,as返回空值。但是,当强制转换成功但类型错误时,它也返回空值。

下面是一个有点愚蠢的例子:

1
2
uint? u = 52;
int? i = (int?) u;   // 'i' is now 52

但是

1
2
3
uint? u = 52;
object d = u;
int? i = d as int?;

我的价值是什么?52?不。它是空的。

为什么里面有物体?事实证明,当我用"是"来解释"是"时,我在上面撒了谎。

观察:

1
2
uint? u = 52;
int? i = (u is int?) ? (int?) u : (int?) null;

我现在是null

1
2
uint? u = 52;
int? i = u as int?;

哎呀。编译器错误。所以,我想这两种说法毕竟不完全相同。