不能,集合类型的类型参数是无法强制转换的。 IConnection<B> b = a as IConnection<A>;//这是不可能成功的,即使里面的元素都是B也不行。必须这样: IConnection<B> b ; foreach(var a in a) { b.Add(a); }
个人感觉,虽说“泛型”很“泛”,满足其约束条件的各种类型都享受同样的操作,但毕竟还有“型”,是“强类型”。 我怀疑虽然两个集合中的元素存在继承关系,但这种继承关系并没有传递给泛型集合,就是说虽然 class B : A,但是 ICollection<B> : ICollection<A> 并不成立。
IConnection <A> a ; IConnection <B> b ; foreach(var a in a) { b.Add((B)a); } 因为A是基类, 所以这样强制转换,应该可以
可是理论上B的集合肯定一定(is a)A的集合啊
class A, class B : A; 为什么ICollection <B>无法转换成ICollection <A>???这样做其实是没必要的, 如果 B 是 A 的子类, ICollection<A> 的元素不但可以是 A, 还可以是 B, 比如 你可以像 ICollection<object> 中添加 string 类型的实例. 当然你也可以弄个辅助方法把 ICollection<B> 拷贝到一个 ICollection <A> 中, 但那不是继承,实现不了多态. 隐式类型转换也不是继承.
IConnection<B> b = a as IConnection<A>;//这是不可能成功的,即使里面的元素都是B也不行。必须这样:
IConnection<B> b ;
foreach(var a in a)
{
b.Add(a);
}
我怀疑虽然两个集合中的元素存在继承关系,但这种继承关系并没有传递给泛型集合,就是说虽然 class B : A,但是 ICollection<B> : ICollection<A> 并不成立。
IConnection <B> b ;
foreach(var a in a)
{
b.Add((B)a);
}
因为A是基类,
所以这样强制转换,应该可以
为什么ICollection <B>无法转换成ICollection <A>???这样做其实是没必要的, 如果 B 是 A 的子类, ICollection<A> 的元素不但可以是 A, 还可以是 B, 比如 你可以像 ICollection<object> 中添加 string 类型的实例. 当然你也可以弄个辅助方法把 ICollection<B> 拷贝到一个 ICollection <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#编译器禁止这样做是完全合理的