gpt4 book ai didi

c# - ObservableCollection 作为参数和接口(interface)传递

转载 作者:行者123 更新时间:2023-11-30 22:14:52 24 4
gpt4 key购买 nike

我有一个接口(interface) IPerson和两个类(class),AdventurerWorker实现它。我目前有单独的 ObservableCollection用于冒险家和 worker 。我有一个方法,我希望能够通过 ObservableCollection<Adventurer>和一个 ObservableCollection<Worker> to 作为参数,到目前为止我还没有运气。该方法仅使用在 IPerson 中实现的属性如果我将其声明为:

public void MyMethod(ObservableCollection<IPerson> collection)

...方法本身没有错误。但是,当我尝试传入 ObservableCollection<Adventurer> 时,我得到 2 个错误:

Cannot convert from 'System.Collections.ObjectModel.ObservableCollection' to 'System.Collections.ObjectModel.ObservableCollection'`

The best overloaded method match for 'AoW.MyMethod(System.Collections.ObjectModel.ObservableCollection)' has some invalid arguments`

我可以同时通过ObservableCollection吗?用同样的方法吗?如果是这样,我应该怎么做?任何建议将不胜感激。

最佳答案

.NET 中的类不支持 covariance and contravariance .只有接口(interface)可以。想象一下这个场景:

class Adventurer : IPerson { }
class NPC : IPerson { }

public void MyMethod(ObservableCollection<IPerson> collection)
{
collection.Add(new NPC());
}

var collectionOfAdventurers = new ObservableCollection<Adventurer>();
MyMethod(collectionOfAdventurers);

这显然会引发一些错误,因为传入的类型是Adventurer 集合,但是该方法添加了一个NPC,但这在编译时无法验证。因此,编译器不允许这种不安全的行为,而是要求传入的类型必须与签名中的类型完全匹配,如果您尝试传入任何其他内容,则会给出错误。

我建议将 MyMethod 更改为:

public void MyMethod(IEnumerable<IPerson> enumerable)

或者

public void MyMethod(INotifyCollectionChanged collection)

具体取决于您需要访问哪些成员。

您可能还想考虑一个通用方法:

public void MyMethod<T>(ObservableCollection<T> collection) where T : IPerson

关于c# - ObservableCollection 作为参数和接口(interface)传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18292195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com