codecamp

C# 转换

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# 继承
C# 抽象类
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }