普通类型转换和使用“AS”关键字有什么区别

时间:2010-09-16 05:54:01

标签: c# .net

  

可能重复:
  Direct casting vs 'as' operator?
  Casting: (NewType) vs. Object as NewType

正常的类型转换与使用“AS”关键字有什么区别?

8 个答案:

答案 0 :(得分:18)

如果对象的类型错误,则使用as将会正常失败,并且结果值将为null,其中正常转换会抛出InvalidCastException:

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

答案 1 :(得分:8)

这两个运算符的用例在表面上是相似的,但在语义上却完全不同。演员与读者沟通“我确信这种转换是合法的,如果我错了,我愿意接受运行时异常”。 “as”操作员传达“我不知道这种转换是否合法;我们将试一试,看看它是怎么回事”。

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

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

答案 2 :(得分:1)

as施法会抛出一个异常,而平常的施法可以。

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

答案 3 :(得分:1)

普通类型强制转换可能会返回IllegalTypeCast异常,而as在这种情况下会返回null

答案 4 :(得分:1)

((Class2) obj)  // Throws exception when the casting cannot be made

Class2 C = obj as Class2  //  Will return NULL if the casting cannot be made

答案 5 :(得分:0)

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

参考类型......

expression as type

完全相同
expression is type ? (type) expression : (type) null

除了expression仅评估一次。

向比尔克林顿致意,'表达式'中的'是',我的意思是'is'。

基本上,正如其他答案所示,这意味着当演员表失败时返回null。但是,当转换成功但类型错误时,它也会返回null。

这是一个有点愚蠢的例子:

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

uint? u = 52;
object d = u;
int? i = d as int?;

我的价值是多少? 52?不。它是空的。

为什么那里的物体?当我用'是'解释'as'时,我说谎了。

观察:

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

'我'现在是null

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

糟糕。编译错误。所以,我猜这两个陈述毕竟不完全相同。

答案 6 :(得分:0)

如果您使用“as”关键字,则永远不会获得转换异常。如果您尝试进行无效转换,转化结果将为null

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

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类之间没有关系,但您自己编写了implicit / explicit运算符。

答案 7 :(得分:0)

另外,因为只能与引用类型一起使用。这实际上非常合乎逻辑,因为如果转换失败,则返回false,这不是值类型的可能值。

因此,对于值类型,必须使用正常的类型转换。