当前位置:  开发笔记 > 编程语言 > 正文

.NET Casting通用列表

如何解决《.NETCasting通用列表》经验,为你挑选了3个好方法。

有人可以向我解释为什么在.NET 2.0中,如果我有一个接口,IPackable以及一个实现该接口的类OrderItem,当我有一个接受a的方法List,传入一个列表List不起作用?

有谁知道我怎么能完成这个功能?

码:

public interface IPackable {
        double Weight{ get; }
}

public class OrderItem : IPackable


public List GetForShipWeight(List packages) {
   double totalWeight = 0;
   foreach (IPackable package in packages) {
        totalWeight += package.Weight;
   }
}

以下代码不起作用.

List orderItems = new List();
List shipMethods = GetForShipWeight(orderItems);

小智.. 14

JMD是正确的一半.事实上,说我们能够使用C#4.0转换通用列表是绝对不正确的.确实,C#4.0将支持协方差和逆变,但它只适用于接口和委托,并且会有很多约束.因此,它将无法使用List.

原因很简单.

如果B是A的子类,我们不能说它List是A的子类List.

这就是原因.

List 公开一些协方差方法(返回值)和一些逆变方法(接受一个值作为参数).

例如

List 自曝 Add(A);

List 自曝 Add(B);

如果List继承自List...而不是你能做到的List.Add(A);

因此,您将失去仿制药的所有类型安全性.



1> 小智..:

JMD是正确的一半.事实上,说我们能够使用C#4.0转换通用列表是绝对不正确的.确实,C#4.0将支持协方差和逆变,但它只适用于接口和委托,并且会有很多约束.因此,它将无法使用List.

原因很简单.

如果B是A的子类,我们不能说它List是A的子类List.

这就是原因.

List 公开一些协方差方法(返回值)和一些逆变方法(接受一个值作为参数).

例如

List 自曝 Add(A);

List 自曝 Add(B);

如果List继承自List...而不是你能做到的List.Add(A);

因此,您将失去仿制药的所有类型安全性.



2> JMD..:

该功能称为协方差/逆变,将在c#4.0中得到支持.你可以在这里阅读:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx


文章似乎已感动。在下面查看示例,Cast <>类位于System.Linq命名空间中,仅供参考。

3> mqp..:

JMD的答案是正确的.要解决此问题,您可以尝试这样做:

List orderItems = new List();
List shipMethods = GetForShipWeight(orderItems);

或者,如果列表必须强类型为OrderItems,那么这个(仅限3.0,抱歉):

List shipMethods =
    GetForShipWeight(orderItems.Cast().ToList());

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有