yatasoft一‘叶’

做一粒微尘,聚满水气,滋润大地
随笔 - 29, 文章 - 0, 评论 - 121, 引用 - 0
数据加载中……

.net类型自定义隐式(显式)转换操作的位置问题

   最近在学习.net基础的东西,今晚上学习转换操作符方法,对类自定义隐式(显式)转换操作符进行了一些研究,发现了自定义隐式(显式)操作符需要注意的一个小问题。

   我假设现在有个Rat类,如果要进行Rat r1 = 5; Int32 x = (Int32) r1; 我们需要给Rat类定义一个由一个Int32隐式构造一个Rat并返回的操作符,和一个由一个Rat显式构造一个Int32并返回操作符

  具体代码如下:

Code

上面代码输出:

你可以发现我把其他类型转换成本类型时定义为隐式转换(Int32转换成Rat),把本类转换成其他类型时定义为显式转换(Rat转换成Int32)。

那么可以为Rat定义一个由一个Rat隐式构造一个Int32并返回方法吗?经过试验发现是可行的(,那么问题来了,假如Int32中同样定义了一个Rat隐式构造一个Int32并返回方法(ps:这里的意思是假如,毕竟Int32是元类型),此时进行一个Rat到Int32的隐式转换会出错吗?

(因为Int32是元类型,我们现在自定义一个Bat类替代Int32来继续试验)

出于好奇我写出下面的代码:

Code

结果编译失败:

继续猜测如果不进行隐式转换,是不是两个类可以同时定义相同隐式转换呢?

注释Mian()内部分代码后:

Code

结果编译成功,用ildasm工具打开编译后的198a.exe查看结果是

 

可以看到类Bat和Rat都有一个叫olmplicit:class Bat(class Rat)的隐式转换操作定义。那么内部定义是否一样呢?

点击查看如下:

可以看出是完全一样的两个隐式转换定义。

ok把试验进行到底,现在把Rat类中隐式定义去掉:

Code

编译成功,并运行得到如下图结果:

可以看到Clr成功的调用了Bat类中定义的隐式Rat转换Bat的操作

我们用ildasm查看编译结果:

再把Bat的隐式转换去掉,让Rat类中存在一个隐式转换。

编译成功,运行结果是:

好了现在来总结下:C#没有对隐式(显式)转换操作的定义位置强制要求,但是你会发现不当的定义将会发生错误,假设下如果几个小组同时进行开发每个小组都有自己的程序集,如果对隐式(显式)转换操作的定义没有个统一的规范会带来错误,我们是不是应该建议这么定义隐式(显式)转换操作:把其他类型转换成本类型时全部定义为隐式式转换,把本类转换成其他类型时定义全部进行显示转换。(ps:也许这个问题早就有规范了只是我不知道呵呵,深夜沪被小雨洗刷的这么安静,我顶着感冒,享受着思考带来的快乐

 

posted on 2008-11-23 01:05 yatasoft 阅读(1566) 评论(3)  编辑 收藏 网摘 所属分类: .Net框架基础

Body:281.25,BeforeCate:31.25,343.75

评论

#1楼   回复  引用    

支持
感谢你分享了你的快乐
2008-11-23 07:36 | 老人[未注册用户]

#2楼   回复  引用  查看    

LZ请问:
这个和“装箱的时候需要隐式转换,拆箱的时候需要显示转换”的区别在哪?
2008-11-23 10:22 | 菜菜渣囧      

#3楼[楼主]   回复  引用  查看    

@老人
:)
@菜菜渣囧
先确定一个问题:装箱是值类型到引用类型的转换,拆箱是引用类型到值类型的转换,那么我上面说的类型的转换,有值类型到引用类型(Int32-->Rat)也用引用类型到引用类型的转换(Rat--->Bat),这和装箱拆箱没有必然关系,另外需要你自己研究的一个问题是:装箱未必都是隐式转换的,你可以借用我的第一个例子继续试验,为Rat添加一个显式转换Int32到Rat的方法。
//由一个Int32显示式构造一个Rat并返回
public static explicit operator Rat(Int32 numerator)
{
return new Rat(numerator);
}
在static void Main()里面修改第一句为: Rat r1 = (Rat)5;
现在就是显式的从Int32到Rat类.
ps:不过不知道是不是你说的装箱,因为感觉装箱这个字段的copy到引用新对象是clr做的,好像我这显式转换的装箱是主动帮clr干了!这个还要继续研究哈。
2008-11-23 18:18 | yatasoft      
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1339208 XrkdUaOr2fM=



相关文章:


相关搜索:
C#隐式(显式)定义 .Net框架基础

相关链接: