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接口的类型只有一种,但编译器并不具体.
为了使用接口而在任何地方使用接口对任何人都无济于事!