对象的引用可以被:

  • 隐式地向上转换

  • 显示的向下转换

向上转换

向上转换是指一个从一个基类指向一个子类:

House house = new House();
Asset asset = house;

House类是Asset的子类

这个时候隐式的向上转换就发生了

Asset类的一个对象asset指向了它的子类House 的对象house

Console.WriteLine(asset == house); // True

由于两个对象指向同一个类House所以他们是相等的。

对于asset来说访问到house的Name属性是非常简单的

但是就没法访问到Mortgage这个属性就没那么容易了,因为Mortgage中指存在了Name并不存在Mortgage这个属性

向下类型转换

向下类型转换是指一个子类的对象指向其基类

House h = new House();
Asset asset = h;
House house = (House)asset;
  • 父类比子类牛逼
  • 父类可以随意引用子类 向上转换
  • 但是子类引用父类需要显示转换 向下转换

向下转换需要显示说明,因为可能存在问题

Stock stock = new Stock();
Asset asset = stock;
House house = (House)asset;

编译时会报错,asset不是House类型所以无法强制转换为House类型

as运算符

as运算符在向下转换时尝试把基类的对象转换成子类的对象,若转换发生错误时,就会赋值null

Stock stock = new Stock();
Asset asset = stock;
House house = asset as House;
if (house != null)
{
Console.WriteLine(house.Mortgage);
}

输出为空,说明house的值为null

is运算符

is运算符用来检测引用的转换是否能够成功,换句话来说,就是检测一个对象是否从某个特定类派生。

        static void Main(string[] args)
{
House mfHouse = new House(){Name = "Nva"};
Asset asset = mfHouse;
if (asset is House)
{
Console.WriteLine(((House)asset).Name);
}
}

C#-类型转换和引用转换的更多相关文章

  1. 《前端之路》之二:数据类型转换 && 隐式转换 || 显式转换

    目录 02:数据类型转换 && 隐式转换 || 显式转换 02:数据类型转换 && 隐式转换 || 显式转换 在上一个章节中,我们介绍了 JavaScript 的基本的 ...

  2. JS的类型转换,强制转换和隐式转换

    JS的类型转换 1.强制转换 通过String(),Number(),Boolean()函数强制转换 var str=123; var str1='123'; console.log(typeof s ...

  3. 05-数据类型转换(bool转换)

    05-数据类型转换(bool转换)

  4. JavaScript | 基础(变量/引用/转换/函数)

    ———————————————————————————————————————————— 变量 全局变量:在函数体外声明,全局可以使用 局部变量:通过关键字var来声明 变量类型 <script ...

  5. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  6. java子类数组的引用转换成超类数组的引用

    public class Person { } public class Student extends Person{ private String name; public Student(Str ...

  7. Number 强制类型转换 int 强制转换整型 float 强制转换浮点型 complex 强制转换成复数 bool 强制转换成布尔类型,结果只有两种,要么True 要么 False """bool 可以转换所有的数据类型 everything"""

    # ###Number 强制类型转换 var1 = 5 var2 = 4.85 var3 = True var3_2 = False var4 = 3+9j var5 = "888777&q ...

  8. javascript中的类型转换(进制转换|位运算)

    1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...

  9. Java数据类型转换(自动转换和强制转换)

    数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制. 自 ...

随机推荐

  1. 【ABP】从零开始学习ABP_入门介绍

    本文介绍自己入坑ABP的过程,一些ABP的相关文章.QQ群,以及ABP Zero示例项目的运行. 背景 作为一个半路出家学习编程的新人,之前工作中也断断续续写过一些代码,但底层核心一直没机会学习,所以 ...

  2. 二十七、SAP中通过以字段的形式输出内容

    一.输出时,需要加入关键词sy-vline,代码如下 二.效果如下

  3. Ubuntu 14.04 搭建 ftp

    一.安装ftp服务器vsftpd $sudo apt-get update $sudo apt-get install vsftpd ftp服务器使用21端口,安装成功之后查看是否打开21端口 $ s ...

  4. 每天一点点之vue框架开发 - 使用vue-router路由

    1.安装路由(安装过的跳过此步) // 进入项目根目录 cd frontend // 安装 npm install vue-router --save-dev 2.在入口文件main.js中引入路由 ...

  5. POJ 1004:Financial Management

    Financial Management Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 165062   Accepted: ...

  6. sql拆分列 时间拆分 日、月、年

    我想 查看今日访问人数 需要分组查询 就得 时间拆分 这两天百度 方法有很多 substring ... 但是 我这一列 是时间类型: 可以直接用 DATEPART() 函数用于返回日期/时间的单独部 ...

  7. 【LeetCode】两个数相加

    [问题]给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. [实例] 输入: ...

  8. springboot整合mybatis与thymeleaf

    1.创建springboot项目 (1)选择Spring Initializr (2)填写自己的Group 与 Artifact (3)选择依赖框架 等待maven下载好依赖和插件即可 2.主配置文件 ...

  9. Oracle 中多个字段显示成一列

    SELECT COALESCE(A,B,C,'NA') FROM XXXXX --判断A若为空则取B,B为空这取C,C为空则取默认值'NA'

  10. select * 和select 1 以及 select count(*) 和select count(1)的区别

    select 1 和select * select * from 表:查询出表中所有数据,性能比较差: select 常量 from 表:查询出结果是所有记录数的常量,性能比较高: selelct 常 ...