gpt4 book ai didi

c# - 在 C# 中,您可以将一个泛型类型转换为另一个泛型类型吗?谁的 T 参数是第一个 T 的子类?

转载 作者:行者123 更新时间:2023-11-30 15:43:39 25 4
gpt4 key购买 nike

我遇到了一个问题,我有一个泛型,我试图将其转换为另一个泛型,其中第二个泛型 T 参数是第一个所用参数的子类。

这是我的代码,经过简化以便于理解...

public partial class HierarchicalItem
{
public ObservableHierarchicalCollection<HierarchicalItem> ContainingCollection{ get; private set; }

public HierarchicalItem Parent{ get{

return (ContainingCollection != null)
? ContainingCollection.Owner
: null;

}}

}

public partial class HierarchicalItem
{

public class ObservableHierarchicalCollection<T> : ObservableCollection<T>
where T : HierarchicalItem
{
public ObservableHierarchicalCollection(HierarchicalItem owner)
{
this.Owner = owner;
}

public HierarchicalItem Owner{ get; private set; }

private void ExistingMemberCheck(T item)
{
if(item.ContainingCollection != null) throw new ExistingMemberException();
item.ContainingCollection = this; // <-- This fails because of casting
}

protected override void InsertItem(int index, T item)
{
ExistingMemberCheck(item);
base.InsertItem(index, item);
}

protected override void SetItem(int index, T item)
{
CheckParent(item);

// Get the item and unhook the hierarchy
var existingItem = this[index];
existingItem.ContainingCollection = null;

base.SetItem(index, item);
}

protected override void RemoveItem(int index)
{
// Get the item and unhook the hierarchy
var existingItem = this[index];
existingItem.ContainingCollection = null;

base.RemoveItem(index);

}

}

}

那么我该如何解决这个问题呢?

最佳答案

C# 4.0 支持显式协方差和逆变。

您可以在 ObservableCollection 接口(interface)声明中使用 out 关键字:

public interface ObservableCollection <out T> { 

//The ObservableCollection methods
}

然后界面将是协变的。

更多信息:

Covariance and Contravariance (C# and Visual Basic)

Covariance and Contravariance FAQ

How is Generic Covariance & Contra-variance Implemented in C# 4.0?

关于c# - 在 C# 中,您可以将一个泛型类型转换为另一个泛型类型吗?谁的 T 参数是第一个 T 的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626315/

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