我可以创建一个List吗?我正在尝试使用4.5generics实现创建一个WeakReferences列表,这样我就可以避免对WeakReference目标进行类型检查和强制转换。但是,WeakReference似乎不支持协方差,所以我正在尝试构建一个解决方法。我认为它应该有效,因为每个T都是特定继承链中的一种类型。所以,我在想的是:publicclassAnimal{}publicclassTiger:Animal{}publicclassWolf:Animal{}varmylist=newList();mylist.Add(newWeakReference(newAnimal()));mylist.Add(newWeakReference(newTiger()));mylist.Add(newWeakReference(newWolf()));我已经尝试为WeakReference创建一个包装类(因为它不可继承),但这不起作用。无论如何,该列表将不接受除WeakReference之外的任何类型的WeakReference。我可以创建我自己的通用Wea??kReference实现,但这似乎打败了它,因为我正在其中进行类型转换。我找不到任何文档,但我假设框架版本可以更好地处理这个问题。有没有其他我没有想到的方法来解决这个问题,或者我找错人了?WeakReference是不可变的,因为它允许设置在协变时无效的值。要使其协变,您需要围绕引用创建一个只读包装器,并使用一个接口。公共接口IReadOnlyWeakReference{T值{get;}}publicclassWeakReferenceWrapper:IReadOnlyWeakReference其中T:class{privateWeakReferencereference;publicWeakReferenceWrapper(WeakReferencereference){this.reference=reference;}publicT值输出{get;reference.TryGetTarget(outoutput))返回输出;否则返回默认值(T);}}}转换扩展方法也有点方便:现在我们可以写:varmylist=newList();mylist.Add(newWeakReference(newAnimal()).AsReadOnly());mylist.Add(newWeakReference(newTiger()).AsReadOnly());mylist.Add(newWeakReference(newWolf()).AsReadOnly());我的建议是创建一个弱引用列表(List)并将其公开为IEnumerable,如下所示:privateListinnerList=newList();publicIEnumerableList{get{return(this.innerList.Where(x=>x.TargetisT).Select(x=>(T)x.Target));你可以简单地使用我们akReference本身,列表无论如何都是List类型的,所以即使有协方差,你也不能访问更多的派生成员varmylist=newList();mylist.Add(newWeakReference(newAnimal()));mylist.Add(newWeakReference(newTiger()));mylist.Add(newWeakReference(newWolf()));或者如果你想保留更具体的类型,有一种方法。我之前用访客模式解决了这个问题。看看是否有帮助。以上是C#学习教程:CanIcreateaList?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: