C#隐式类型和显示类型

一,在程序中我们经常会遇到:无法将类型“XXX”隐式装换为“XXX”,如下例子:

             static void Main(string[] args)
                {
                    int i;
                    i = "Hello World";
                 }

那这是什么原因呢?

由于 C# 是在编译时静态类型化的,因此变量在声明后就无法再次声明,或者无法用于存储其他类型的值,除非该类型可以转换为变量的类型。 例如,不存在从整数到任意字符串的转换。 因此,在将 i 声明为整数后,无法将字符串“Hello World”赋予它.

二, 在 C# 中,常见的两种类型的转换:

1》隐式转换:

1,系统默认的、不需要加以声明就可以进行的转换,在隐式转换过程中,编译器无需对转换进行详细检查就能够安全地执行转换。

2,该转换是一种类型安全的转换,不会导致数据丢失,因此不需要任何特殊的语法。

PS:示例包括从较小整数类型到较大整数类型的转换(从int到float的转换)以及从派生类到基类的转换(子类到父类)。

2》显式转换(强制转换):

1,显式转换需要用户明确地指定转换的类型

2,显式转换需要强制转换运算符。 在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。

PS:典型的示例包括从数值到精度较低或范围较小的类型的转换(float到int的转换)和从基类实例到派生类的转换(父类到子类)。

三,那为什么隐式转换不会导致数据丢失,而显示转换会?

1》隐式转换不会丢失原因:对于内置数值类型,如果要存储的值无需截断或四舍五入即可适应变量,则可以进行隐式转换。

例如,long 类型的变量(8 字节整数)能够存储 int(在 32 位计算机上为 4 字节)可存储的任何值。 在下面的示例中,编译器先将右侧的值隐式转换为 long 类型,再将它赋给 longNum。

          int intnum = 68564235;
            long longNum = intnum;
            Console.WriteLine(longNum);

2》显示转换如下:

         //错误:无法将类型“double”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)
            double x = 1234.4567;
            int a;
            a = x;
            Console.WriteLine(a);

下面的程序将 double 强制转换为 int。 如不强制转换则该程序不会进行编译,并有无法将类型“double”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)

这样的意思是:当我们在将精度大的转换为精度小的(或者父类转换为子类时),这时就是显示转换,但是当我们存在显示转换而没有强制转换的时候编辑就会报错,如下解决:

        double x = 1234.4567;
        int a;
        a = (int)x;
        Console.WriteLine(a);    

但是这个时候,我们输出的值就是int的精度的值,就是1234

*拓展知识

三、那引用类型的隐式和显示转换又是怎样的呢?如下例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TypeDemo2
{
    class Program
    {
        static void Main()
        {
            //派生类是继承基类过来的,所有基类有的定义它都会有,所以这样的隐式转换是被认为合法的
            Animal a = new Dog();
            a.Eat();
            //然而基类类型不能隐式转换为派生类,因为派生类中的成员定义在基类中是不一定存在的
            //Dog d = new Animal();

            //同时基类类型不能显示转换为派生类,强转也是报错的
            //Animal aa = new Animal();
            //Dog d = (Dog)aa;
            //d.Eat();


            //在理解隐式和显式的时候还有一个误区,如下,神奇的事发生了,不是基类不能隐式转换为派生类么?
            //以下代码的理解是:虽然类型是Animal,但是他的实际的值还是指向余内存的Dog这块空间,所以当你使用AS dog时候不会报错
            Animal a1 = new Dog();
            Dog d = a1 as Dog;
            //a1.Say();   //这样写报错
            d.Eat();
            d.Say();
        }
    }
    class Animal
    {
        public void Eat()
        {
            Console.WriteLine("吃!!!");
        }
    }
    class Dog : Animal
    {

        public void Say()
        {
            Console.WriteLine("汪汪");
        }
    }

}

综上:引用类型的隐式转换是合法的(派生类转换成基类,子类转换成父类),而反之报错,因为派生类成员定义不一定子在基类中存在

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值