我有以下类(class)
public class AccountingBase<TItemType> where TItemType : AccountingItemBase
在我的 AccountingItemBase 我有以下属性:
public virtual AccountingBase<AccountingItemBase> Parent { get; set; }
在我的 AccountingBase 中,我正在尝试执行以下操作
item.Parent = this;
从逻辑上讲,这应该可行,因为 TItemType 继承自 AccountingItemBase,但我收到以下错误:
> Error 1 Cannot implicitly convert type
> 'TGS.MySQL.DataBaseObjects.AccountingBase<TItemType>'
> to
> 'TGS.MySQL.DataBaseObjects.AccountingBase<TGS.MySQL.DataBaseObjects.AccountingItemBase>'
如何将子属性父属性设置为自身(在父类中)
最佳答案
不,你的直觉是错误的。它不应该工作,因为泛型类在 .NET 中不是变体。
仅仅因为 TItemType
继承自 AccountingItemBase
并不意味着 AccountingBase<TItemType>
继承自 AccountingBase<AccountingItemBase>
。假设 AccountingBase<TItemType>
有一个 TItemType
类型的字段。那么如果你的直觉是正确的,你可以写:
AccountingBase<SomeSubtype> x = new AccountingBase<SomeSubtype>();
AccountingBase<AccountingItemBase> y = x;
y.SomeField = new OtherSubtype();
这显然会破坏类型安全性,因为当将其视为
AccountingBase<SomeSubtype>
时,该字段的类型是 SomeSubtype
,但您已经在其中放置了 OtherSubtype
类型的值!基本上,通用方差是一个复杂的话题。
我建议您阅读 Eric Lippert 长而详细的 blog post series 以获取更多信息。或者我有一个来自 NDC 2010 的视频,您可能会觉得它很有用。基本上在 .NET 4 中有一些通用的差异,但它是有限的。
现在,至于你在你的情况下可以做什么:
AccountingBase
继承自的非泛型基类。这可能是最好的主意。然后将 Parent
属性的类型设为非泛型类型。 AccountingBase
本身和它的父级都通用......但这最终会导致递归问题,有效......