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,而第二种则会抛出异常。

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


posted @ 2013-12-13 22:06  Hi-Jimmy  阅读(124)  评论(0编辑  收藏  举报