错误类型ConcreteSet必须可转换为BaseSet <baseitem>

时间:2017-07-17 17:08:16

标签: c# derived-class

我创建了两个抽象类:BaseSetBaseItem,它们是ConcreteSet的父级

public class BaseItem { }
public class ConcreteItem { } : BaseItem
public class BaseSet<T> where T : BaseItem { }
public class ConcreteSet : BaseSet<ConcreteItem> { }

现在我创建了一个动态类型为BaseSet<BaseItem>

的经理
public abstract class BaseSetManager<T> : PersistentSingleton<BaseSetManager<T>>
where T : BaseSet<BaseItem>

接下来,当我尝试使用以下命令派生此经理时:

public sealed class ConcreteSetManager : BaseSetManager<ConcreteSet>

我得到了错误The type 'ConcreteSet' must be convertible to 'BaseSet<BaseItem>' in order to use it as parameter 'T' in generic class 'BaseSetManager'

有没有办法像这样保持抽象,或者我不得不放弃抽象并回到基本的一般类型。

我使用的Unity3D不支持协方差(C#3.0)

1 个答案:

答案 0 :(得分:2)

由于我仅限于C#3,现在唯一的方法是在BaseSetManager中使用多个类型。更好的想法仍然受到赞赏。

public abstract class BaseSetManager<T, P> : PersistentSingleton<BaseSetManager<T, P>>
where T : BaseSet<P>
where P : BaseItem

public sealed class ConcreteSetManager : BaseSetManager<ConcreteSet, ConcreteItem>

如果您正在寻找具有更高语言目标的答案,请从@AsadSaeeduddin找到有问题的评论