有人可以向我解释为什么在.NET 2.0中,如果我有一个接口,IPackable
以及一个实现该接口的类OrderItem
,当我有一个接受a的方法List
,传入一个列表List
不起作用?
有谁知道我怎么能完成这个功能?
码:
public interface IPackable { double Weight{ get; } } public class OrderItem : IPackable public ListGetForShipWeight(List packages) { double totalWeight = 0; foreach (IPackable package in packages) { totalWeight += package.Weight; } }
以下代码不起作用.
ListorderItems = new List (); List shipMethods = GetForShipWeight(orderItems);
小智.. 14
JMD是正确的一半.事实上,说我们能够使用C#4.0转换通用列表是绝对不正确的.确实,C#4.0将支持协方差和逆变,但它只适用于接口和委托,并且会有很多约束.因此,它将无法使用List
.
原因很简单.
这就是原因.
List
公开一些协方差方法(返回值)和一些逆变方法(接受一个值作为参数).
例如
List
自曝 Add(B);
如果List
继承自List
...而不是你能做到的List.Add(A);
因此,您将失去仿制药的所有类型安全性.
JMD是正确的一半.事实上,说我们能够使用C#4.0转换通用列表是绝对不正确的.确实,C#4.0将支持协方差和逆变,但它只适用于接口和委托,并且会有很多约束.因此,它将无法使用List
.
原因很简单.
这就是原因.
List
公开一些协方差方法(返回值)和一些逆变方法(接受一个值作为参数).
例如
List
自曝 Add(B);
如果List
继承自List
...而不是你能做到的List.Add(A);
因此,您将失去仿制药的所有类型安全性.
该功能称为协方差/逆变,将在c#4.0中得到支持.你可以在这里阅读:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx
JMD的答案是正确的.要解决此问题,您可以尝试这样做:
ListorderItems = new List (); List shipMethods = GetForShipWeight(orderItems);
或者,如果列表必须强类型为OrderItems,那么这个(仅限3.0,抱歉):
ListshipMethods = GetForShipWeight(orderItems.Cast ().ToList());