• C# 隐式转换 显示转换



    什么是隐式转换:转换的类型内部有对应implicit operator方法的可进行隐式转换


    什么是显示转换:转换的类内部有对应explicit operator或implicit operator方法的可进行显式转换


    隐式的转换由其内部implicit operator方法转换,程序员只需写value1=value2即可。

    显式的转换由其内部explicit operator方法转换,若没有explicit operator,将使用implicit operator方法。程序员需标明转换类型value1=(value1Type)value2。


    隐式转换方法示例:

        public class Type1
        {
            private int value = 0;
            public Type1(int value)
            {
                this.value = value;
            }
            //隐式的将double类型转为Type1类型
             public static implicit operator Type1(double v)
            {
                return new Type1(Convert.ToInt32(v));
            }
             //隐式的将Type1类型转为double类型
            public static implicit operator  double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }
        }

    使用时:

               Type1 tt = new Type1(123);
                double dd = tt;
         
                double d=222;
                Type1 t = d;


    显式转换方法示例:

     public class Type1
        {
            private int value = 0;
            public Type1(int value)
            {
                this.value = value;
            }
            //显示的将double类型转为Type1类型
            public static  explicit operator  Type1(double v)
            {
                return new Type1(Convert.ToInt32(v));
            }
            //显示的将Type1类型转为double类型
            public static explicit operator  double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }
        }

    使用时:

                Type1 tt = new Type1(123);
                double dd =(double) tt;
         
                double d=222;
                Type1 t = (Type1)d;


    注意:

    1.如果上面的Type1只定义了隐式转换方法(implicit operator),当对Type1显式转换时,将调用其隐式转换方法,但相反若只定义了显式转换方法(explicit oprator),直接进行隐式转却无法调用显式转换方法。
    2.在Type1内,相同类型间相同转换方向的显式与隐式转换方法不能同时存在:

    如:不能同时存在

           public static explicit operator double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }

           public static implicit operator double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }

    但是却可以同时存在:

           public static explicit operator Type1(double v)//将double显式转换为Type1
            {
                return new Type1(Convert.ToInt32(v));
            }
            public static implicit operator double(Type1 v)//将Type1隐式转换为double
            {
                return Convert.ToDouble(v.value);
            }



    PS:基本类型之间的数据转换有下面几个方法:(以double转int为例):

    double d=123;

    int i=0;

    1.i=Convert.ToInt32(d);

    2.i=Int.Parse(d.ToString());

    3.int.Trypase(d.ToString(),out i);

    4.i=(int)d;


    这四者的区别在于:

    第一种转换参数支持最多,可以支持大部分基本类型:double,bool,string,byte.....

    第二种是属于Int类型自己的转换方法,参数只能是string

    第三种与第二种类似,但是返回值是bool表示转换是否成功。他的特点在于如果转换失败不会抛出异常只会返回false,而第二种则会抛出异常。

    第四种只能是数值类型间的强制类型转换。


    作者:Mr.Jimmy
    出处:https://www.cnblogs.com/JHelius
    联系:yanyangzhihuo@foxmail.com
    如有疑问欢迎讨论,转载请注明出处

  • 相关阅读:
    使用delphi 开发多层应用(十)安全访问服务器
    使用delphi 开发多层应用(十三)使用Basic4android 直接访问kbmMW server
    使用delphi 开发多层应用(十一)使用kbmMW 开发webserver
    basic4android 开发教程翻译(八)使用ListView
    使用delphi 连接国产数据库:达梦
    kbmMW 4.01.00 Beta 1发布了
    解决 ie 下 javascript 设置 table.tBodies.innerHTML 无法设置的问题
    用vs2010 把 vcf 转成 csv,再转入Nokia
    GAC 与 引用 程序集路径
    sqlserver 函数 之 进制转换
  • 原文地址:https://www.cnblogs.com/JHelius/p/14318924.html
Copyright © 2020-2023  润新知