C#中对象类型转换(as /(int))之间的区别

时间:2011-11-15 07:17:50

标签: c# casting

  

可能重复:
  What is the difference between the following casts in c#?

当我在使用C#时,她正在进行类型转换,我怀疑: -

  

“as vs.(int)/(string)/ ... soon”的对象类型转换有什么区别?

实施例

int a = (int) value;

VS

int a = value as int;

string a = (string) value;

VS

string a = value as string;

很快......

有任何帮助可以详细解释这个吗?

提前致谢。

5 个答案:

答案 0 :(得分:3)

From msdn:

  

as运算符用于执行某些类型的转换   在兼容的引用或可空类型之间。

     

说明:

     

as运算符就像一个强制转换操作。但是,如果转换   是不可能的,因为返回null而不是引发异常。   请考虑以下表达式:

expression as type
     

除了表达式之外,它等效于以下表达式   只评估了一次。

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

请注意,as运算符仅执行转换以引用或   可空类型和拳击转换。 as运算符无法执行   其他转换,例如用户定义的转换,应该   而是通过使用强制转换表达式来执行。

答案 1 :(得分:1)

您不能使用非可空值类型,您只能使用可空的值。我的意思是下面的行会给你一个构建错误/

int a = value as int;

无论如何,如果转换无效,则as返回null。我们通常使用它。

Class1 c1 = value as Class1;
if (c1 != null)
{
    //do your logic.
}

答案 2 :(得分:1)

前缀和后投的主要区别在于演员失败时会发生什么。例如,想象一下,g实际上是AnotherSpecificType的一个实例,它不是SpecificType的子类。在这种情况下,prefix-cast会抛出异常 - 但是,当转换失败时,as-cast会返回null,从而允许执行程序桶。

看看这篇文章:

https://sites.google.com/site/gmamaladze/projects/short-articles/prefix-casting-versus-as-casting-in-c

答案 3 :(得分:0)

使用as运算符与C#中的强制转换不同,有三个重要方面:

  • 当您尝试转换的变量不是请求的类型或其继承链时,它返回null,而不是抛出异常。
  • 它只能应用于转换为引用类型的引用类型变量。
  • 使用as不会执行用户定义的转换,例如隐式转换运算符或显式转换运算符,转换语法将执行此操作。

答案 4 :(得分:0)

如果您尝试在as类型上投放value,例如int a = value as int;,则会获得InvalidCastException。值类型必须为(int) intValue

如果您正在考虑任何reference类型。您可以使用as在投标失败时返回null。您可以使用(string) value之类的直接投射,如果投射失败,这里会获得exception