C#定义自定义类型转换
类型转换不限于单一继承链中的类型(派生类转换为基类或者基类转换为派生类),完全不相关的类型之间也能进行转换。关键在于在两个类型之间提供转型操作符。
在下面这样的情况下应该定义显式转型操作符:
- 在转型有可能失败时,开发者应该定义显式转型操作符。,例如:从long转换为int,这样可以提醒别人只有在确信转型会成功的时候才执行这样的转型,否则,就准备好在失败的时候捕捉异常。
- 执行有损转换的时候,开发者也应该优先使用显式转型。例如:将float转型为int。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Project5_42 { class Program { static void Main(string[] args) { Sheep sheep = new Sheep(); Volf volf = new Volf(); sheep.say(); sheep = (Sheep)volf; sheep.say(); volf.say(); volf = sheep; volf.say(); } } class Sheep { public void say() { Console.WriteLine("I am a sheep"); } //使用implicit声明为隐式类型转换 public static implicit operator Volf(Sheep sheep) { Console.WriteLine("I turned to a volf from a sheep"); return new Volf(); } } class Volf { public void say() { Console.WriteLine("I am a volf"); } //使用explicit声明为显式类型转换 public static explicit operator Sheep(Volf volf) { Console.WriteLine("I turned to a sheep from a volf"); return new Sheep(); } } }
上面的例子演示了为不同类之间转换定义显式和隐式操作符的情况。显示转化使用:explicit声明,在转换时使用括号进行强制类型转换,请求编译器相信程序员的选择,隐式类型转换用:implicit,而隐式类型转换直接可以用赋值表达式。