【分享】发现一个有趣的事情。

颤菊大师 2009-11-19 10:41:14
        public static void Hello<T>(T val)
{
Console.WriteLine("泛型:"+val.GetType().ToString());
}

public static void Hello(string val)
{
Console.WriteLine("字符串:" + val.GetType().ToString());
}

public static void SayHello<T>(T val)
{
Hello(val);
}

public static void Main()
{
Hello("你好");//很显然,调用的肯定是 Hello(string val)
SayHello("你好");//这个呢?
}


最近写类库,重构的过程中,修改了一些代码,发现竟然不可以运行了。于是就发现了类似上方的状况。

简单的说:
在 SayHello 里的调用 Hello ,我管你什么类型,统统分配到 Hello<T>。

不过这点挺无语的。还没来得及学 MSIL……不知道为什么不选择调用【类型符合】的 Hello?
...全文
72 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
颤菊大师 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vrhero 的回复:]
引用楼主 mrlen 的回复:
在 SayHello 里的调用 Hello ,我管你什么类型,统统分配到 Hello <T>。

这跟你在哪里调用没有关系...SayHello本身就是泛型方法,很显然只符合Hello <T>(T val)的签名不符合Hello(string val)的签名...T只在运行时才有确定的类型...

如果这都看不明白,只能怀疑你的逻辑能力...
[/Quote]
嘿嘿。就是因为我觉得是在运行时,
才觉得为什么不“智能”点?因为我是想匹配 Hello(string val)的签名
Dobzhansky 2009-11-19
  • 打赏
  • 举报
回复
cpp 泛型是编译时泛型, 嗯.
狼王_ 2009-11-19
  • 打赏
  • 举报
回复
菜鸟围观
vrhero 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 mrlen 的回复:]
在 SayHello 里的调用 Hello ,我管你什么类型,统统分配到 Hello <T>。
[/Quote]
这跟你在哪里调用没有关系...SayHello本身就是泛型方法,很显然只符合Hello<T>(T val)的签名不符合Hello(string val)的签名...T只在运行时才有确定的类型...

如果这都看不明白,只能怀疑你的逻辑能力...
Dobzhansky 2009-11-19
  • 打赏
  • 举报
回复
.net 的 泛型是 运行时 泛型?
颤菊大师 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shmiluwabi666 的回复:]
个人觉得有了
public static void Hello <T>(T val)
       
那么public static void Hello(string val)就没有必要了吧
       
[/Quote]

如果你碰到

public bool IsNull <T>(T val){ T == null}

呢?
龙宜坡 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoukang0916 的回复:]
当打点字!冷!
[/Quote]

熊猫屁股更冷
wangbinykit 2009-11-19
  • 打赏
  • 举报
回复
个人觉得有了
public static void Hello<T>(T val)

那么public static void Hello(string val)就没有必要了吧
PandaIT 2009-11-19
  • 打赏
  • 举报
回复


当打点字!冷!
阿非 2009-11-19
  • 打赏
  • 举报
回复
SayHello<T>(T val)

Hello(string val)

110,534

社区成员

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

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

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