msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx
http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx
http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx
operator关键字重载内置操作符,或在类别或结构声明中提供用户定义转换。它可以定义不同类型之间的转换方法和结果。
operator在定义类型转换时可以使用两种方法(implicit)和显示转换(explicit)
一般的定义方法是
public static implicit 目标类型(转化类型) 变量参数){ return 目标类型结果;}public static explicit 目标类型(转化类型) 变量参数){ return 目标类型结果;}
代码案例
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 自定义装换{ class Program { static void Main(string[] args) { myclass mc = 1;//通过隐式装换,生成myclass对象 Console.WriteLine(mc.Value); myclass mc2 = new myclass(2); Console.WriteLine((int)mc2);//显示转换,调用myclass到int的处理方法 Console.WriteLine(mc2);///隐式转化,调用myclass到string的处理方法 } } class myclass { private int value;///声明value私有字段 public int Value//声明只读属性 { get { return value; } } public myclass(int value)//构造函数 { this.value = value; } public static explicit operator int(myclass mc)///显示声明的myclassint处理方法 { return mc.value; } public static implicit operator myclass(int value)///隐式声明int转myclass类处理方法 { return new myclass(value); } public static implicit operator string(myclass mc)///隐式声明的myclass转string类处理方法 { return (定义myclassstring类型转换结果); } } }
结果
这可以防止编译器在没有提示的情况下调用可能产生不可预见后果的转换操作。
2.在使用implicit的隐式声明时,请注意,当有多个从当前类别转换为其他类型数据的隐式声明时,可能会出现编译错误,因为在隐式声明下,两者都可以调用,编译器不知道选择哪个。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 自定义装换{ class Program { static void Main(string[] args) { myclass mc2 = new myclass(2); Console.WriteLine(mc2);//错位,编译器无法选择有效的类型转换方法 } } class myclass { private int value; public int Value { get { return value; } } public myclass(int value) { this.value = value; } public static implicit operator myclass(int value) { return new myclass(value); } ///2隐式声明myclass类转换类型的方法 public static implicit operator int(myclass mc) { return mc.value; } public static implicit operator string(myclass mc) { return (定义myclassstring类型转换结果); } }
解决方法:
1.将console.writeline()强制转换输出,明确转换目标,如
Console.WriteLine((string)mc2);
2.将两种隐式转换方法之一改为显示,编译器将默认调用隐式转换方法
public static explicit operator int(myclass mc)//改为显示转换 { return mc.value; } public static implicit operator string(myclass mc) { return (定义myclassstring类型转换结果); }