C# 转换
2018-01-16 03:40 更新
C# 转换
转换和引用
对象引用可以是:
- 隐式向上转换为基类引用
- 显式地向下转换为子类引用
上传总是成功的;只有在对象正确键入时,向下转换才会成功。
向上转换
向上转换操作从子类引用创建基类引用。
例如:
Product myProduct = new Product();
Item a = myProduct; // Upcast
Product
, DiscountProduct
, Item
都在上一节中定义。
在upcast之后,变量a仍然引用与变量myProduct相同的Product对象。
被引用的对象本身不被改变或转换:
Console.WriteLine (a == myProduct); // True
虽然a和myProduct引用相同的对象,但是对该对象有更严格的视图:
Console.WriteLine (a.Name); // OK
Console.WriteLine (a.InStoreCount); // Error: InStoreCount undefined
最后一行生成编译时错误,因为变量a的类型为Item,即使它引用了Product类型的对象。
要到达其InStoreCount字段,我们必须将该项目下转到产品。
向下转换
向下转换操作从基类引用创建子类引用。
例如:
Product myProduct = new Product();
Item a = myProduct; // Upcast
Product s = (Product)a; // Downcast
Console.WriteLine (s.InStoreCount);
Console.WriteLine (s == a); // True
Console.WriteLine (s == myProduct); // True
与upcast一样,只有引用受影响,而不是底层对象。
向下转换需要显式转换,因为它可能在运行时失败:
DiscountProduct h = new DiscountProduct();
Item a = h; // Upcast always succeeds
Product s = (Product)a; // Downcast fails: a is not a Product
如果向下转换失败,则抛出 InvalidCastException
。
as运算符
as
运算符执行一个求值为null的向下转换,而不是在向下转换失败时抛出异常:
Item a = new Item();
Product s = a as Product; // s is null; no exception thrown
当您要随后测试结果是否为null时,这很有用:
if (s != null) {
Console.WriteLine (s.InStoreCount);
}
以上内容是否对您有帮助:
← C# 继承
更多建议: