1

假设有一个接口A和一个实现该接口的类的变量“x”。现在我可以执行这些:

var a = (A) x;

或者:

var a = x as A;

我知道在失败的情况下,第一条语句会抛出 an InvalidCastException,第二条语句会 return null。但是还有其他区别吗?特别是性能?

4

3 回答 3

2

通过这样做(A)x,你正在做一个肯定会尝试和施放的演员,如果它不能施放,就会有一个例外。

如果您使用as它将强制转换或成为null.

但是,您拥有自己尝试此操作所需的所有示例代码,因此您可以在询问我们您所说的代码将要做什么之前尝试此操作。

于 2013-02-20T14:21:09.493 回答
1

第一个尝试立即转换,第二个实际上检查 x 是否属于 A 类型。

于 2013-02-20T14:21:24.733 回答
1

as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。

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

考虑以下示例:

expression as type

该代码等价于以下表达式,只是表达式变量仅计算一次。

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

请注意,as 运算符仅执行引用转换、可为空的转换和装箱转换。as 运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。

参考: as(C#参考)

于 2013-02-20T14:22:47.510 回答