Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的不同类型#_C#_Casting - Fatal编程技术网

C# C语言中的不同类型#

C# C语言中的不同类型#,c#,casting,C#,Casting,可能的重复项: 哎, 我知道这可能是个愚蠢的问题,但今天我产生了怀疑 这两者的区别是什么 String text = (String) variable; 及 ?如果变量实际上不是该类型(String在本例中),as将返回null。演员阵容将抛出一个异常 演员可以做三件事: 执行用户定义的转换 执行取消装箱转换 执行引用转换 as操作几乎总是引用转换,唯一的例外是取消装箱为可空类型: object x = "hello"; int? y = x as int?; // y is nul

可能的重复项:

哎,

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

这两者的区别是什么

String text = (String) variable;


如果
变量
实际上不是该类型(
String
在本例中),as
将返回null。演员阵容将抛出一个异常

演员可以做三件事:

  • 执行用户定义的转换
  • 执行取消装箱转换
  • 执行引用转换
as
操作几乎总是引用转换,唯一的例外是取消装箱为可空类型:

object x = "hello";
int? y = x as int?; // y is null afterwards
然后是转换在执行时失败的行为。因此,区别在于:

  • 执行引用转换或取消装箱的强制转换将在失败时抛出
    InvalidCastException
    as
    将导致目标类型的空值
  • 强制转换可以执行用户定义的转换<代码>作为不能
  • 强制转换可以取消绑定到不可为null的值类型<仅当目标类型为可空值类型时,代码>as才能用于取消装箱

这是埃里克·利珀特关于C#中演员的博客链接。我想总结一下,但篇幅很短,他会比我解释得更好

这是他在演员组的帖子:


在C#中有很多不同的方法

这将尝试将引用强制转换为字符串引用。如果强制转换失败,将引发异常:

string text = (String) variable;
这将尝试将引用强制转换为字符串引用。如果强制转换失败,它将返回一个空引用以分配给变量:

string text = varible as String;
这会将字符串引用强制转换为对象引用,这是一种安全的强制转换,因为字符串继承自对象:

object text = (object)"1337";
也可以隐式执行对父类的强制转换:

object text = "1337";
int value = 42;
object boxed = value;
int valueAgain = (int)boxed;
这将在对象内装箱一个值,然后再次将其取消装箱为普通值:

int value = 42;
object boxed = (object)value;
int valueAgain = (int)boxed;
装箱也可以隐式完成:

object text = "1337";
int value = 42;
object boxed = value;
int valueAgain = (int)boxed;
这将进行从字节到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

如果变量实际上不是该类型或派生类型(本例中为字符串),请参见as将返回null。演员们将抛出一个例外。快来吧。请记住,
as
对值类型不起作用<代码>整数i=对象作为整数将不会编译。
as
关键字必须与引用类型或可为空的类型一起使用,正如@Mehrdad Afshari所说的那样。@Matt:它有效。您需要使用可为空的类型:
int?i=作为int?的obj