class A, class B : A;
为什么ICollection<B>无法转换成ICollection<A>???

解决方案 »

  1.   

    不能,集合类型的类型参数是无法强制转换的。
    IConnection<B> b = a as IConnection<A>;//这是不可能成功的,即使里面的元素都是B也不行。必须这样:
    IConnection<B> b ;
    foreach(var a in a)
    {
       b.Add(a);
    }
      

  2.   

    个人感觉,虽说“泛型”很“泛”,满足其约束条件的各种类型都享受同样的操作,但毕竟还有“型”,是“强类型”。
    我怀疑虽然两个集合中的元素存在继承关系,但这种继承关系并没有传递给泛型集合,就是说虽然 class B : A,但是 ICollection<B> : ICollection<A> 并不成立。
      

  3.   

    IConnection <A> a ; 
    IConnection <B> b ; 
    foreach(var a in a) 

     b.Add((B)a); 
    }
    因为A是基类,
    所以这样强制转换,应该可以
      

  4.   

    可是理论上B的集合肯定一定(is a)A的集合啊
      

  5.   

    class A, class B : A; 
    为什么ICollection <B>无法转换成ICollection <A>???这样做其实是没必要的, 如果 B 是 A 的子类, ICollection<A> 的元素不但可以是 A, 还可以是 B, 比如 你可以像 ICollection<object> 中添加 string 类型的实例. 当然你也可以弄个辅助方法把 ICollection<B> 拷贝到一个 ICollection <A> 中, 但那不是继承,实现不了多态. 隐式类型转换也不是继承.
      

  6.   

    这个问题在C#4.0是一个新特性比如A=object,B=string 符合你说的class B : A;吧
    IList<object>a;
    IList<string>b;
    如果按你所说,就是这样:
    a=b; 吧?既然a是IList<object>,那么这样的代码就是合法的:
    a[0]=1;好,问题产生了:
    b跟a指向相同的内存空间,a[0]=1,所以b[0]=1;
    但是b[n]应该是string类型,显然就出现错误了C#编译器非常聪明,它知道会产生这样的问题,所以拒绝做这样的转换。而在C#4.0中,这个问题得到了解决,它通过在泛型参数上施加in/out约束,避免的错误的产生
    class MyList<out T>//out表示T只会被用在输出中,值不会被改变
    {
    }
    MyList<object>a;MyList<string>b;
    此时可以:
     a=b;class MyLit<int T>//in表示只用于输入
    {
    }
    MyList<object>a;MyList<string>b; 
    此时可以:
     b=a;C# 4.0还没来 ,既然存在我之前说的错误转换的问题,C#编译器禁止这样做是完全合理的