C#:“(子类型)数据”和“数据作为子类型”类型转换之间有什么区别?

时间:2009-07-22 21:33:38

标签: c# .net types oop casting

假设我知道某个对象的实例属于通过C#中的超类型的引用传递给我的某个子类型的子类,我习惯于看到类似Java的方式进行类型转换(假设“引用“属于超类型”:

if (reference is subtype){
subtype t = (subtype)reference;
}

但是最近我遇到过这样做的例子:

if (reference is subtype){
subtype t = reference as subtype;
}

这两个完全相同吗?有什么不同吗?

7 个答案:

答案 0 :(得分:11)

不同之处在于,如果转换不正确,则会抛出异常而另一个将返回空值。另外,“as”关键字对值类型不起作用。

BaseType _object;

//throw an exception
AnotherType _casted = (AnotherType) _object; 

//return null
AnotherType _casted = _object as AnotherType;

修改

Fabio de Miranda 的示例中,由于使用了“is”关键字而无法输入“if”语句,因此不会抛出异常。

答案 1 :(得分:6)

它们使用的方式相同,但两者都不是最好的选择。你应该只进行一次类型检查:

subtype t = reference as subtype;
if (t != null) {
   ...
}

检查null比检查类型更有效。

答案 2 :(得分:1)

“as”尝试将引用转换为子类型&如果失败则返回null 失败时显式转换,抛出InvalidCastException。

答案 3 :(得分:1)

不,他们不相同。第一个将适用于任何类型,但第二个示例仅适用于引用类型。原因是“as”运算符仅对引用类型有效。

答案 4 :(得分:1)

1。据我所知(可能已过时)“as”比施法更快。

2。您的两个示例都不是最佳选择。最佳方式是:

var v = reference as subtype;
if (v != null){
  // Do somthing.
}

这样就没有双重铸造问题。

答案 5 :(得分:1)

http://msdn.microsoft.com/en-us/library/cscsdfbt(VS.71).aspx

其中说:“as”等于:

表达式是什么类型? (type)expression:(type)null;

这意味着第二个意味着太多了。

答案 6 :(得分:-1)

一个重要的事情是,当使用as运算符时,这样的类型应该是可空的,因为如果失败,它将返回null。然而,使用C风格的强制转换会在无法执行强制转换时抛出异常。