C#几对修饰符的比较(三)implicit与explicit

这几天写序章剧情战斗模版时,出现一些让人感觉很难受的类型转换的情况.
简单说就是从一个正常情况下全是class A实例的池子里,取出object b (b实际上也是A类型的),赋值给一个class A的变量a.这时,就需要把b再强制转换回class A.

这个过程虽然没什么问题,但是让人感觉很蛋疼. 究其原因,应该是因为从池子里取出object的方法为了追求其普适性,而把返回值设为了object.
现在产生了这种不太自然的情况,让我开始怀疑这种追求普适性的做法是否是正确的.也许我应该用泛型或者重载处理下?

值得一提的是,这里的类型转换有个小细节:将object b转换成A类型时,用的是 b as A 而不是用 (A)b 强制转换.
这两种语法的效果差别,主要表现为前者在转换失败时会返回null,而后者会异常.

最后正文,来说说implicit与explicit修饰符. ~~事实上我根本没用到过它们,纯粹时为了提上面那些感想裁写得此文.~~

这两个修饰符,是在重载”类型转换运算符”时使用的.两个单词直译过来分别是隐式的(implicit)和显式的(explicit).顾名思义,很容易理解它们的差别.

和其他运算符的重载一样, 声明重载必须是public static.
需要注意的是二者的使用时机,implicit修饰的重载转换运算符为隐式转换,应当保证转换后不会丢失数据(效果如”float a = int b”),否则应当使用explicit修饰(效果如前面”(A)b”里的”(A)”).

参考

转换运算符(C# 编程指南)

发表评论

电子邮件地址不会被公开。 必填项已用*标注