我的函数
public void Myfunction(class1<typeBase> 参数)
{
...
}
希望传入参数的类型class1<type1>
type1继承于typeBase
如何做到?如果直接传会报错!
class1<type1> 参数1;
....Myfunction(参数1);编译报错
泛型 错误 无法将类型 “class1<type1>” 转换为“class1<typeBase>”

解决方案 »

  1.   

    4.0以下的貌似做不到,4.0或其以上的可以通过定义<in T>实现
      

  2.   

    public void Myfunction(class1<typeBase> 参数)
    {
    ...
    }
    =>
    public void Myfunction<T>(class1<T> 参数) where T : typeBase
    {
    ...
    }
      

  3.   

    把class1<type1>整体当做一个类了,应该是public void Myfunction<T>(T myclass)  限定T是typeBase
      

  4.   


    必须做不到。因为class1<type1>和class1<typeBase>没有任何关系。
      

  5.   

    public void Myfunction<T>(class1<T> 参数) where T : typeBase
    {
    ...
    }
    不行,在函数内部进行对比时出现同样问题
    函数内部,我引用了一个list<typeBase>类型,typeBaseList
    typeBaseList的函数不能调用参数!
      

  6.   

    List<type1> thelist = ...
    List<typeBase> list = thelist.Select(x => x as typeBase).ToList();
      

  7.   

    !this.typeBaseList.Contains(参数)
    我用的是2005,      2008的select不可用
      

  8.   

    public void Myfunction<T>(class1<T> 参数) where T : typeBase
    {
    ...
    }
    不行,在函数内部进行对比时出现同样问题
    函数内部,我引用了一个List<typeBase>类型,typeBaseList
    typeBaseList的函数不能调用参数! 
    具体调用为
    if(!this.typeBaseList.Contains(参数))....
    我用的是2005
      

  9.   

    List<type1> thelist = ...
    List<typeBase> list = new List<typeBase>();
    foreach (type1 item in thelist)
    {
        list.Add(item as typeBase);
    }
    ...
      

  10.   

    不会要求把
    Myfunction<T>函数所在的Class也做成泛型吧
      

  11.   


    用协变来说的话,我感觉应该这么解释:class<type>和class1<typeBase>也根本没有关系啊,两种类型。
    就像ClassA和ClassB一样。转换什么的,还是像版主那么转换吧。
    最好写个T ConvertTo<T,S>(S in)这类的
      

  12.   

    lz说了“type1继承于typeBase”,你没看到。
      

  13.   

    晕呀!
    我不能把Myfunction<T>函数所在的Class也做成泛型 ,因为不可能呀
      

  14.   

    public void Myfunction<T>(class1<T> 参数) where T : typeBase
    {
    ...
    }
    不行,在函数内部进行对比时出现同样问题
    函数内部,我引用了一个List<typeBase>类型,typeBaseList
    typeBaseList的函数不能调用参数!  
    具体调用为
    if(!this.typeBaseList.Contains(参数))....
    我用的是2005如何实现?
    !this.typeBaseList.Contains(参数)
    //this.typeBaseList不仅包含type1,还包含type2
      

  15.   

    ---刚刚回复的有问题,现更正
    public void Myfunction<T>(class1<T> 参数) where T : typeBase
    {
    ...
    }
    不行,在函数内部进行对比时出现同样问题
    函数内部,我引用了一个List<class1<typeBase>>类型,BaseList
    BaseList的函数不能调用参数!   
    具体调用为
    if(!this.BaseList.Contains(参数))....
    我用的是2005如何实现?
    !this.BaseList.Contains(参数)
    //this.BaseList不仅包含Class1<type1>,还包含Class1<type2>
     
     
      

  16.   

    --刚刚的回复有问题
    public void Myfunction<T>(class1<T> 参数) where T : typeBase
    {
    ...
    }
    不行,在函数内部进行对比时出现同样问题
    函数内部,我引用了一个List<Class1<typeBase>>类型,typeBaseList
    typeBaseList的函数不能调用参数!   
    具体调用为
    if(!this.typeBaseList.Contains(参数))....
    我用的是2005如何实现?
    !this.typeBaseList.Contains(参数)
    //this.typeBaseList不仅包含Class1<type1>,还包含Class1<type2>
      

  17.   


    但是List<Type>没有继承List<typeBase>啊如果typeBase有两个子类 Type 和Type2, 就可以看出问题所在了呗。
    一个 List<typeBase> baselist= new List<typeBase>();
    baseClass.Add(new Type1()); baseClass.Add(new Type2());
    这让baseList怎么往List<Type>上联系啊。所以我的理解是,即使Type与typeBase有继承关系,但是这不说明List<Type>与List<typeBase>有继承关系啊。
      

  18.   

    本帖最后由 caozhy 于 2012-04-18 16:26:55 编辑
      

  19.   

    //this.typeBaseList不仅包含Class1<type1>,还包含Class1<type2>???不可能???
      

  20.   

    List<class1<type1>> thelist = ...
    List<class1<typeBase>> list = new List<class1<typeBase>>();
    foreach (class<type1> item in thelist)
    {
      list.Add(item as class<typeBase>);
    }
    ---------------
    item as class<typeBase> 会返回什么?如果成功,应该用他就可以了吧
      

  21.   

    public class Class1<T> where T : typeBase
    {
    ....
    }
    语义上有一个基本类Class1<typeBase>但是实际上不是如此吗?
      

  22.   

    既然是as 你觉得他会是什么
    因为list是泛型List<class1<typeBase>> 当然需要转换
    既然要返回List<typeBase>把type1转换成typeBase即可
      

  23.   

    谢谢大家参与,我准备绕弯子了。
    也就是说:
    泛型类是不变的。也就是说,如果输入参数指定 List<BaseClass>,则当您试图提供 List<DerivedClass> 时,将会发生编译时错误。