我想这样,让一个方法,根据传入不同的值类型做不同的处理。
-------------------------------------------------------
 public Tinput1 Compute<Tinput1,Tinput2>(Tinput1 t1,Tinput2 t2)
        {
            if (t1 is int&&t2 is int)
            {
                t1 = (int)t1;
                t2 = (int)t2;
                t1 = t1 + t2;
            }
            else if (t1 is string&&t2 is string)
            {
                t1 = (string)t1;
                t2 = (string)t2;
                t1 = t1 + t2;
            }
            else if (t1.GetType().IsSubclassOf(typeof(object)))
            {
                this.b = t1.Equals(t2);
                t1 = (bool)t1;
                t1 = Convert.ToInt32(this.b);
            }
            return t1;
        }但是出现8个错误,不能t1 = (int)t1;t2 = (int)t2;t1 = (string)t1;t1 = t1 + t2;等,那有什么办法 让它可以呢?

解决方案 »

  1.   

    t1 = (int)t1;
    t2 = (int)t2;
    t1 = t1 + t2;=====>return (int)t1 + (int)t2;
      

  2.   

    你的代码中都没用上泛型....你的方法实际上是
    public object Compute(object t1,object t2);不过是批一件没有意义的泛型的皮. 泛型的好处是把类型检查提前到了编译时,但是你在运行的时候执行了这么多的 is 啊强制转换啊.....而且最后那个else逻辑明显有问题 t1 = (bool)t1;
    从哪里让你觉得这个语句可以执行成功了?
      

  3.   

    return (int)t1 + (int)t2;不行,看来得查查,大概与“泛型类型中的变化”有关,才看了下MSDN本地帮助上的此主题,这个主题的内容多,而且我看得二懂二懂的,唉
      

  4.   

    public int Compute(int t1,int t2){return t1+t2; }
    public string Compute(string t1,string t2){return t1+t2; }
    ..............这维护起来并不比你这么一堆if-else要复杂(我觉得应该还更容易),而且代码每个只有1行,又不用类型检查,明显写3个重载比你写这个"假的" 泛型方法要好的多.你也许要说如果类型有100种,难道要写100个重载啊? 那你如果类型100种的话,100个重载虽然有问题,也比你一个方法里一个100个分支的if语句要更好. 横竖都不是你这种写法.
      

  5.   

    同意 syeerzy,没有这样设计的
      

  6.   

    找到的一些可能相关的资源,与有相同需求者一起学习。
    http://studycs.com/ShowArticle.aspx?id=371
    http://birdshover.cnblogs.com/articles/392127.html原方法的意思,大概表述有误,因为用一个泛型参数就够了如下: public T Compute<T>(T t1,T t2) where T :struct
            {
                if (t1 is int)
                {
                    int i = 0;
                    i = t1 + t2;
                }
                else if(t1 is string)
                {
                    //例如比较输出较短的长度的string值。
                }
                return t1;
            }但这还是错的,因为,原因t1+t2这样的表达不能通过编译,因为,经考查理解了,泛型,只是一个“占位标志”在运行时通过其自身的元数据(这方面我不太懂)在IL中间语言中的处理,为具体类型的,所以这里它仍然仅是一个占位标志,无法使用很多,运算号。////////////////////////////////////////////////////////////////////////////
    还有一个问题一起问了,就是
    假如我有多个泛型参数,如void M<T1,T2,T3>(T1 t1,T2 t2)//这里我要约束T1,T2,T3该如何来写where,我只见过后面跟一个泛型的情况,如 where T1:ImyInterface 等,
      

  7.   

    后面一个问题,原来是,想约束多少直接写where就行了,如下:
     void M<T1,T2>(T1 t)
                where T1 :class
                where T2 :struct
            {
            }
      

  8.   


    【IT168 技术教程】
    泛型简介
            所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。
    C#泛型演示
    class Stack<T>
    {
      private T[] store;
      private int size
      public Stack()
      {
        store = new T[10];
        size = 0;
      }
      public void Push(T x)
      {
        store[size++] = x;
      }
      public void T Pop()
      {
        return store[--size];
      }
    }
    Stack<int> x = new Stack<int>();
    x.Push(17);
    C#泛型机制简介
            C#泛型能力由CLR在运行时支持,区别于C++的编译时模板机制,和java的编译时的“搽拭法”。这使得泛型能力可以在各个支持CLR的语言之间进行无缝的互操作。
            C#泛型代码在被编译为IL和元数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以“on-demand”的方式,发生在JIT编译时。
    C#泛型编译机制
            第一轮编译时,编译器只为Stack<T>类型产生“泛型版”的IL代码和元数据,并不进行泛型类型的实例化,T在中间只充当占位符。JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int类型替换“泛型版”IL代码与元数据中的T -- 进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码,但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码 在这儿记录一下(网摘)