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? 

解决方案 »

  1.   

    SayHello<T>(T val) Hello(string val)
      

  2.   

    个人觉得有了
    public static void Hello<T>(T val)
            
    那么public static void Hello(string val)就没有必要了吧
            
      

  3.   


    如果你碰到public bool IsNull <T>(T val){ T == null}呢?
      

  4.   

    .net 的 泛型是 运行时 泛型?
      

  5.   

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

  6.   

    cpp 泛型是编译时泛型, 嗯.
      

  7.   

    嘿嘿。就是因为我觉得是在运行时,
    才觉得为什么不“智能”点?因为我是想匹配 Hello(string val)的签名