Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 普通类型转换和使用“;AS”;关键词_C#_.net - Fatal编程技术网

C# 普通类型转换和使用“;AS”;关键词

C# 普通类型转换和使用“;AS”;关键词,c#,.net,C#,.net,可能的重复项: 正常类型转换与使用“AS”关键字有什么区别?如果对象类型错误,则使用AS将正常失败,结果值将为null,其中正常转换将抛出InvalidCastException: object x = new object(); string y = x as string; // y == null string z = (string)x; // InvalidCastException ascast会抛出异常,而普通cast会抛出异常 Object a = new Object()

可能的重复项:


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

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

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

as
cast会抛出异常,而普通cast会抛出异常

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

正常类型转换可能会返回非法类型转换异常,在这种情况下,as
as
将返回
null

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

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

Class2 C = obj as Class2  //  Will return NULL if the casting cannot be made
对于引用类型

expression as type
真的和

expression is type ? (type) expression : (type) null
除了
表达式
只计算一次之外

在向比尔·克林顿点头的时候,在“表达式是类型”中,我指的是“是”

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

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

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

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

为什么里面有东西?事实证明,当我用“是”来解释“是”时,我在上面撒了谎

注意:

uint? u = 52;
int? i = (u is int?) ? (int?) u : (int?) null;
“i”现在为
null

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

哎呀。编译器错误。因此,我猜这两个语句毕竟并不完全相同。

这两个操作符的用例表面上相似,但语义上却大不相同。cast向读者传达“我确信这种转换是合法的,如果我错了,我愿意接受运行时异常”。“作为”运营商传达“我不知道这种转换是否合法;我们将尝试一下,看看它是如何进行的”

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


如果使用“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之间没有关系,但您自己编写了一个/运算符。

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


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

简而言之:is和as也是is。不仅如此,我还编写了C#,它使用“?”,就像Lisp使用括号一样。:-)它可以传达这一点,但不一定。当我确信转换会起作用时,我使用了
作为
关键字,因为我更喜欢看:
(mybj作为MyType)。SomeProperty
胜过
((MyType)mybj)。SomeProperty
在这种情况下,我所做的方式表明,如果运行时发生
NullReferenceException
,我愿意接受它。我只是想指出这是一种风格上的东西。@jasonh-那样使用
作为
对我来说是一种风格上的错误。这会让我们想知道为什么没有做演员。此外,无效的强制转换异常会比空引用异常更快地导致开发人员出现问题。我更喜欢埃里克的风格。
public class A {}
public class B {}
...
A a = new A();
//B b = (B)a;  //compile error:Cannot implicitly convert type 'A' to 'B'