什么是隐式转换:被转换的类型内部有对应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,而第二种则会抛出异常。
第四种只能是数值类型间的强制类型转换。