我有以下类(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 本身和它的父级都通用......但这最终会导致递归问题,有效......
  • 10-08 13:26