C#中的转换问题

voi*_*ter 1 c# casting covariance contravariance

我有一个继承自IList的接口:

public interface IBase {}
public class Derived : IBase {}
public interface IMyList : IList<IBase> {}
Run Code Online (Sandbox Code Playgroud)

我想将类型的变量转换为类型IMyList,IList<Derived>或者List<Derived>更容易或最有意义.最好的方法是什么?

请注意,我使用的是.NET 3.5

Jus*_*ner 10

直接投射不适合,因为可能会出现许多问题(IMyList可能包含其他类型Derived等)

只要您不修改列表(在这种情况下,IEnumerable<Derived>可以工作),您可以简单地:

var validItems = myList.Cast<Derived>();
Run Code Online (Sandbox Code Playgroud)

然后迭代结果.

编辑

根据以下OP的评论,还有两件事需要提及:

1)如果你需要IList<Derived>,你可以简单地添加到上面并打电话myList.Cast<Derived>().ToList();

2)如果那些是真正的要求,那么你的代码没有任何意义.如果IMyList只应该包含Derived对象,那么IMyList应该派生自IList<Derived>.请记住,虽然您知道实现IBase接口的类型只有一种,但编译器并不具体.

为了使用接口而在任何地方使用接口对任何人都无济于事!

  • @Robert:那么你不应该使用任何涉及制作列表副本的技术 - 比如做一个Cast <>后跟ToList().您可能需要创建一个代理,将强制转换置于每个接口方法调用之上. (2认同)