这几行代码为什么会陷入死循环?

dangdang2471 2016-03-02 11:37:59

public class T1
{
public virtual void Fun(string s)
{
}
}

public class T2 : T1
{
public override void Fun(string s)
{
}

public void Fun(object s)
{
Fun(s.ToString());
}
}

public class T3 : T1
{
public new void Fun(string s)
{
}

public void Fun(object s)
{
Fun(s.ToString());
}
}



T1 a = new T2();
a.Fun("xx"); // T2.Fun(string s)

T2 b = new T2();
b.Fun("xx"); // T2.Fun(object s)死循环

T1 c = new T3();
c.Fun("xx"); // T1.Fun(string s)

T3 d = new T3();
d.Fun("xx"); // T3.Fun(string s)
...全文
333 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2016-03-03
  • 打赏
  • 举报
回复
楼主自己应该也看得出来吧,似乎 object 参数的同名方法优先执行了。 这种同名函数,继承方法的运行规律知道就好了
dangdang2471 2016-03-02
  • 打赏
  • 举报
回复
T1 a = new T2(); a.Fun("xx"); // T2.Fun(string s) T2 b = new T2(); b.Fun("xx"); // T2.Fun(object s)死循环 为什么对象a和b的调用方法不一样呢?
Poopaye 2016-03-02
  • 打赏
  • 举报
回复
重载的选用问题,总之c#她就是觉得Fun(object)这个重载更好 https://msdn.microsoft.com/zh-cn/library/aa691356%28v=vs.71%29.aspx
xdashewan 2016-03-02
  • 打赏
  • 举报
回复
你t2无限调用Fun(object s)当然死循环,obj是所有所有对象的基类,调用时候先找自身方法,再找基类的方法,你改个int就不会这样了
白衣如花 2016-03-02
  • 打赏
  • 举报
回复
a是T1类型,但是可以强制转换成T2 b本身就是T2类型
Poopaye 2016-03-02
  • 打赏
  • 举报
回复
因为a没得选啊

111,125

社区成员

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

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

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