C#中的不同转换类型

时间:2010-02-25 18:40:41

标签: c# casting

  

可能重复:
  Casting: (NewType) vs. Object as NewType
  Why is the C# “as” operator so popular?

嗨,

我知道这可能是个愚蠢的问题,但今天我怀疑这个问题。

之间有什么区别
String text = (String) variable;

String text = variable as String;

4 个答案:

答案 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/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

这是关于演员的帖子:

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