请高手指点,用Reflector查看Enum.CompareTo的源码时发现的疑问?

zshufeng 2006-09-11 01:01:57
用Reflector查看Enum.ComopareTo方法的源码时发现:
public int CompareTo(object target)
{
if (target != null)
{
Type type1 = base.GetType();
Type type2 = target.GetType();
if (type1 != type2)
{
throw new ArgumentException(string.Format(Environment.GetResourceString("Arg_EnumAndObjectMustBeSameType"), type2.ToString(), type1.ToString()));
}
。。。。
}
Type type1 = base.GetType(); //此句取得的type1应该为System.Enum
Type type2 = target.GetType(); //此句取得的type2应该为自定义的枚举的全名称
if (type1 != type2) 应该总为FALSE的,而且我故意使用两个不同的枚举测试,发现
throw new ArgumentException(string.Format(Environment.GetResourceString("Arg_EnumAndObjectMustBeSameType"), type2.ToString(), type1.ToString()));这句抛出的异常是显示Type type1 = base.GetType();这句其实应该是this.GetType();
请高手给予指点!

...全文
268 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LVOLCANO 2006-09-15
  • 打赏
  • 举报
回复
Mark
zshufeng 2006-09-11
  • 打赏
  • 举报
回复
多谢www_123du_com(鼠.神.泪),我以前都没注意到这点!!
www_123du_com 2006-09-11
  • 打赏
  • 举报
回复
(new而非override) ---- 打错了

由于不是虚函数,这里不能用override重写它。
www_123du_com 2006-09-11
  • 打赏
  • 举报
回复
由于所有继承自object的类都没有重写GetType方法,所以最终都是调用的object.GetType方法。
那么调用this.GetType()与base.GetType()方法是一样的。
而.NET编写者担心用户扩展某些类时覆盖(new而与override)GetType()方法,于是用base.GetType()方法相对来讲更能保证是object.GetType()方法。(当然,这里其实应该是没必要的,Enum里面写不了方法)
Santos 2006-09-11
  • 打赏
  • 举报
回复
GetType()得到的应该是一个类型的对象,我认为
当type1和type2object不同时,应该是两个不同的对象,所以
type1 != type2 这个逻辑此时为true,则throw ArgumentException.
当是同一个枚举类型时,应该相同,则
type1 != type2 为false。

www_123du_com 2006-09-11
  • 打赏
  • 举报
回复
你在Page_load里面写:
Type type1 = this.GetType();
Type type2 = base.GetType();
return; //在这里设个断点,会发现typ1与type2是一样的

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧